클라이언트에 OID가 설치되어 있는지 여부에 관계없이 snmp 응답을 동일한 방식으로 처리하는 bash 스크립트를 만들려고 합니다.
고객은 다음과 같은 응답을 받을 수 있습니다.
SNMPv2-SMI::mib-2.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "
iso.3.6.1.2.1.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "
나는 ID 번호인 마지막 부분인 1062를 얻고 싶습니다. 이 응답은 47.1.1.1.1.13(ID 번호)을 공유합니다.
클라이언트의 초기 응답에 관계없이 ID 번호만 인쇄하도록 텍스트를 어떻게 처리합니까?
답변1
예를 들어 숫자와 점 뒤의 숫자를 제외한 모든 항목을 제거할 수 있습니다.
sed -e 's/.*[0-9.]*\.\([0-9]*\).*/\1/'
설명하다:
.* anything
[0-9.]* digits and dots in any order
\. dot
\( start a matching group
[0-9]* digits
\) end the matching group
.* anything
일치하는 모든 문자열은 일치하는 그룹, 즉 숫자와 점 뒤의 마지막 숫자로 대체됩니다.
답변2
확실한 유일한 것이 그 뒤에 숫자 문자열을 원한다는 것이라면 47.1.1.1.1.13.
다음 중 하나를 사용할 수 있습니다.
grep -Po '47\.1\.1\.1\.1\.13.\K\d+'
sed -n 's/.*47\.1\.1\.1\.1\.13\.\([0-9]\+\).*/\1/p'
perl -lne '/47\.1\.1\.1\.1\.13\.(\d+)/ && print $1'
귀하의 예에서와 같이 대상 문자열이 항상 before 인 경우 다음을 STRING
사용할 수 있습니다.
grep -Po '\d+(?= STRING)'
sed -n 's/.*\.\([0-9]\+\) STRING.*/\1/p'
perl -lne '/(\d+)(?= STRING)/ && print $1'
또는 대상 문자열이 항상 점, 숫자 문자열 및 공백(질문에 표시되는 내용)의 첫 번째 항목인 경우 다음을 수행할 수 있습니다.
grep -Po '^\S+\.\K\d+'
sed -n 's/^[^ \t]*\.\([0-9]\+\).*/\1/p'
perl -lne '/^\S+\.(\d+)/ && print $1' file
답변3
기반으로문자열에서 두 개의 하위 문자열 제거:
$ shopt -s extglob
$ resp1='SNMPv2-SMI::mib-2.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "'
$ resp2='iso.3.6.1.2.1.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "'
$ echo ${resp1//@(*47.1.1.1.1.13.| STRING*)}
1062
$ echo ${resp2//@(*47.1.1.1.1.13.| STRING*)}
1062