正規表現awkからCiscoインターフェースへ

正規表現awkからCiscoインターフェースへ

以下のような特定の属性を持つ 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 到達不能なし

関連情報