必須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

に基づいて文字列から2つの部分文字列を削除する:

$ 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

関連情報