【问题标题】:Delete multiple lines above and below from a matching pattern in a file using awk/sed/grep使用 awk/sed/grep 从文件中的匹配模式中删除上下多行
【发布时间】: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 有一个错字.../ 不应该在那里
  • 感谢您指出问题。是的,删除 / 后它起作用了。

标签: bash shell awk sed grep


【解决方案1】:

这可能对你有用(GNU sed):

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

提供文件原样。这将收集整个已注册的块并删除包含字符串192.168.1.2 的块。

【讨论】:

  • 谢谢。这可行,但我的要求是使用 IP 作为变量。
  • 您能否建议如何使这个通用IP适用于任何IP?
【解决方案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

【讨论】: