【发布时间】:2016-10-18 15:41:34
【问题描述】:
我有 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;
...
...
...
}
}
我尝试了 2 种方法来实现这一点,但无法成功
1) 使用 grep:这不起作用。
grep -v -B6 -A6 $IP file.txt > out.txt
mv -f out.txt file.txt
2) 使用 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
非常感谢您在此处找出问题的任何帮助。
谢谢。
【问题讨论】:
-
带有变量的 awk 有一个错字...
/不应该在那里 -
感谢您指出问题。是的,删除
/后它起作用了。