ルータから別のライセンスを取得するために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
スペースで区切られたフィールドの数が一貫している場合に使用できるもう1つのアプローチです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