2016-10-18 13 views
1

使用してファイル内のマッチングパターンから上方および下方に複数の行を削除します。は、私はfile.txtを含むいるのawk/sedの/ grepを

registered 
{ 
    hostname-1 
    { 
     AAA 32; 
     BBB uuid-1; 
     ip 192.168.1.1; 
     host hostname-1; 
     ... 
     ... 
     ... 
    } 
} 
registered 
{ 
    hostname-2 
    { 
     AAA 31; 
     BBB uuid-2; 
     ip 192.168.1.2; 
     host hostname-2; 
     ... 
     ... 
     ... 
    } 
} 
registered 
{ 
    hostname-3 
    { 
     AAA 33; 
     BBB uuid-3; 
     ip 192.168.1.3; 
     host hostname-3; 
     ... 
     ... 
     ... 
    } 
} 

私は、IPの一致に基づいて、一つの完全な登録されているブロックを削除したいです。

など。 IPが192.168.1.2の場合、出力は次のようになります。

registered 
{ 
    hostname-1 
    { 
     AAA 32; 
     BBB uuid-1; 
     ip 192.168.1.1; 
     host hostname-1; 
     ... 
     ... 
     ... 
    } 
} 
registered 
{ 
    hostname-3 
    { 
     AAA 33; 
     BBB uuid-3; 
     ip 192.168.1.3; 
     host hostname-3; 
     ... 
     ... 
     ... 
    } 
} 

私はgrepを使用)、これを達成するための2つの方法を試してみましたが、それは

1を動作させることができませんでした:これは動作しませんでした。 awkの使い方

grep -v -B6 -A6 $IP file.txt > out.txt 
mv -f out.txt file.txt 

2):私は下のawkコマンドで正確なIPを与えると は、それは

awk '/192.168.1.2/{for(x=NR-6;x<=NR+6;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file.txt 

作品しかし、私はawkコマンドで変数$ IPを通過したいです。それは動作していません

awk -v pattern="${IP}" '$0 ~ pattern/{for(x=NR-6;x<=NR+6;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file.txt 

ここで問題を見つけるための助けがあれば幸いです。

ありがとうございました。

+0

変数付きのawkはタイプミスをしています... '/'はそこにあるべきではありません – Sundeep

+1

問題を指摘していただきありがとうございます。はい、 '/'を取り除いた後で動作しました。 – user4060247

答えて

0
IP=192.168.1.2 
awk '/'$IP'/{for(x=NR-6;x<=NR+6;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file.txt 
+0

ありがとう。出来た。 – user4060247

1

これはあなた(GNU SED)のために働くかもしれない:あるとして

sed -n '/^registered/h;//!H;/^}/!b;g;/192\.168\.1\.2/!p' file 

ファイルの提供です。これは、登録されたブロック全体を集め、文字列192.168.1.2を含む1つを削除します。

+0

ありがとうございます。これは動作しますが、私の要求はIPを変数として使用することでした。 – user4060247

+0

このIPアドレスをどのようにIPにするか提案してください。 – user4060247

関連する問題