
以下のような特定の属性を持つ Cisco インターフェイス セクションを解析するための Sed/Grep または Awk 正規表現があるかどうかを知りたいです。
ファイル.txtの内容
!
interface FastEthernet0/1
no ip unreachables
!
interface FastEthernet0/2
no ip proxy-arp
!
脚本:
#!/bin/bash
VALUE="no ip proxy-arp"
awk -v RS='!\n' -v PATTERN=${VALUE} '/$PATTERN/' file.txt | awk '/^interface/';
exit 0
問題は、シェルから直接行を実行すると機能するが、スクリプトから実行すると機能しないことです。
を実行すると、変数値を置き換えることができないことbash -x
がわかります。awk
助言がありますか ?
答え1
これがシェルで動作するとは信じがたいです。それにもかかわらず、このコードにはいくつかのエラーが含まれており、私の意見では間違ったアプローチも含まれています。
awk は変数ではなく文字列を期待します//
。これらは定数正規表現です。したがって、シェルに変数をそこに配置させるか、 を使用します~
。
修正に対するアプローチ:
awk -v RS='!\n' -v PATTERN="${VALUE}" '$0 ~ PATTERN' file.txt |
awk '/^interface/'
これが機能することに驚きました。ドキュメントから、RS の設定により不要な「!」が印刷されるだろうと予想していました。しかし、私はこれがより良いと考えます:
awk -v PATTERN="${VALUE}" \
'$0 ~ PATTERN { print previousline; }; { previousline=$0; }' file.txt
またはハードコードされたパターン
awk '/no ip proxy-arp/ { print previousline; }; { previousline=$0; }' file.txt
またはシェルがパターンを書き込む
awk /"$VALUE"/' { print previousline; }; { previousline=$0; }' file.txt
答え2
エコー "! インターフェースFastEthernet0/1 IP 到達不能なし ! インターフェースFastEthernet0/2 IPプロキシARPなし " | pcregrep -M "^インターフェース .*0/1\n (.*\n)!"
結果:
インターフェースFastEthernet0/1 IP 到達不能なし