SNMP에서 특정 데이터 추출

SNMP에서 특정 데이터 추출

라우터에서 다른 라이센스를 얻기 위해 SNMP 폴링을 수행했습니다. 정보를 성공적으로 검색했습니다. 이제 해당 정보를 표시하고 싶습니다. 내 출력 스냅샷은 다음과 같습니다.

SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.1 = STRING: "ipbasek9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.2.1 = STRING: "securityk9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.2.2 = STRING: "uck9"

나는 따옴표 안에 무엇이 있는지 보여주고 싶습니다.

  • "ipbasek9"
  • "securityk9"
  • 등.

모든 데이터를 따옴표로 강조 표시하는 정규식 "(.*?)"을 찾았지만 실제로 텍스트에서 데이터를 추출하는 명령은 무엇입니까? 나는 awk, sed, grep의 변형을 시도했지만 여전히 운이 없습니다.

답변1

솔루션 1

grep이 옵션은 내장되어 있으며 가끔 직접 사용합니다.
에서 man grep:

       -o, --only-matching
          Print only the matched (non-empty) parts of a matching line, with each  such  part  on  a  separate
          output line.

그런 다음 다음을 사용하여 원하지 않는 문자를 제거할 수 있습니다 tr.

$ tr -d '"'

테스트 문자열:

$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | grep -E -o '"(.*?)"' | tr -d '"'

산출:

securityk9

솔루션 2

공백으로 구분된 필드의 수가 일관적인 경우 사용할 수 있는 또 다른 접근 방식입니다 cut(그리고 tr여전히 파이프가 2개이므로 한 번에 수행할 수 있다고 확신합니다).

$ cut -d ' ' -f 4 | tr -d '"'

시험:

$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | cut -d ' ' -f 4 | tr -d '"'
securityk9

해결 방법 3

이는 Perl 5가 설치된 모든 Linux 및 Unix 시스템에서 사용할 수 있는 perl가장 다재다능하고 이식성이 뛰어납니다 . 출력을 다음으로 파이프합니다.

perl -p -e 's/.*?"(\w+)"/$1/g' -

예:

$ echo 'SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.1 = STRING: "ipbasek9"' | perl -p -e 's/.*?"(\w+)"/$1/g' -
ipbasek9

설명하다:

-p           iterate over each line of input
-e           execute following code
s/foo/bar/g  substitute 'foo' with 'bar' globally, in entire line
.*?"         match any characters non-greedy, so up to first left-most double quote "
(\w+)        match and capture into $1 any word-characters (alphanumeric, underscore _, plus connector punctuation chars)
$1           substitute with with whatever was captured in first parenthesis 

관련 정보