我有包含以下内容的file.txt:
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;
...
...
...
}
}我尝试了两种方法来实现这一点,但都不能成功。
1)使用grep:这不起作用。
grep -v -B6 -A6 $IP file.txt > out.txt
mv -f out.txt file.txt2)使用awk:如果我在下面的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任何帮助找出这里问题的人都将不胜感激。
谢谢。
发布于 2016-10-18 15:41:34
这可能适用于您(GNU sed):
sed -n '/^registered/h;//!H;/^}/!b;g;/192\.168\.1\.2/!p' file假设文件是原样的。这将收集整个已注册的块,并删除包含字符串192.168.1.2的块。
发布于 2016-10-18 12:34:24
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.txthttps://stackoverflow.com/questions/40099447
复制相似问题