2016-10-18 117 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刪除一個完整的註冊塊。

E.g.如果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; 
     ... 
     ... 
     ... 
    } 
} 

我嘗試2種方法來實現這一點,但不能使它工作

1)使用grep:這沒有奏效。

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

2)使用AWK: 如果我給出確切IP awk命令之下,然後它工作

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 

但我想通過變量$ IP awk命令。這是行不通的

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 one with variable has a typo ...'/'不應該在那裏 – 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的那個。

+0

謝謝。這有效,但我的要求是使用IP作爲變量。 – user4060247

+0

你能否建議如何使這個通用的任何IP? – user4060247