次のような特定の属性を使用して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
問題は、シェルから直接lineを実行すると機能しますが、スクリプトで実行すると機能しないことです。
実行してみると、変数の値を変更できないbash -x
ことがわかります。awk
どんな提案がありますか?
答え1
これがシェルで動作するとは信じ難いです。それにもかかわらず、このコードにはいくつかのエラーが含まれており、IMHOのアプローチが間違っています。
//
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 "^Interface.*0/1\n (.*\n)!"
結果:
インターフェイス FastEthernet0/1 IPがないと接続できない