필수 ID만 인쇄하기 위해 snmp 텍스트를 처리하는 Bash 스크립트

필수 ID만 인쇄하기 위해 snmp 텍스트를 처리하는 Bash 스크립트

클라이언트에 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

관련 정보