라우터에서 다른 라이센스를 얻기 위해 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