首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用awk/sed/grep从文件中的匹配模式中删除上下多行

使用awk/sed/grep从文件中的匹配模式中删除上下多行
EN

Stack Overflow用户
提问于 2016-10-18 12:20:36
回答 2查看 145关注 0票数 1

我有包含以下内容的file.txt:

代码语言:javascript
复制
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,则输出应为:

代码语言:javascript
复制
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:这不起作用。

代码语言:javascript
复制
grep -v -B6 -A6 $IP file.txt > out.txt
mv -f out.txt file.txt

2)使用awk:如果我在下面的awk命令中给出了确切的IP,那么它可以工作

代码语言:javascript
复制
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。它不起作用

代码语言:javascript
复制
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

任何帮助找出这里问题的人都将不胜感激。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-10-18 15:41:34

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed -n '/^registered/h;//!H;/^}/!b;g;/192\.168\.1\.2/!p' file

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-18 12:34:24

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40099447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档