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

スペースで区切られたフィールドの数が一貫している場合に使用できるもう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 

関連情報