
クライアントに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