Delete multiple lines above and below from a matching pattern in a file using awk/sed/grep
我有 file.txt 包含:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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 那么输出应该是:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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:这不起作用。
1
2 |
grep -v -B6 -A6 $IP file.txt > out.txt
mv -f out.txt file.txt |
2) 使用 awk:
如果我在下面的 awk 命令中给出确切的 IP,那么它可以工作
1
|
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。它不工作
1
|
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
|
任何帮助找出这里的问题将不胜感激。
谢谢。
这可能对你有用(GNU sed):
1
|
sed -n ‘/^registered/h;//!H;/^}/!b;g;/192//.168//.1//.2/!p’ file
|
提供文件原样。这将收集整个注册块并删除包含字符串
的块
1
2 |
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 |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/270650.html