在文件中匹配后删除4个连续行

时间:2016-07-21 07:37:33

标签: bash awk replace sed dns

我正在删除DNS服务器上大约33k的区域。我使用这个awk字符串在zones.conf文件中找到匹配的行:

awk -v RS= -v ORS='\n\n' '/domain.com/' zones.conf

这给了我下面的输出,这就是我想要的。

zone "domain.com" {
    type master;
    file "/etc/bind/db/domain.com";
};

我现在面临的问题是删除4行。 是否可以使用sed或awk来执行此操作?

编辑: 我已经决定要在while循环中运行。 List.txt包含我要从zones.conf文件中删除的域。 每一行都被定义为变量' $ {line}'并在awk中定义(由" l' L' l"提供) 字符串原来是:

awk -v OFS='\n\n' '/domain.com/{n=4}; n {n--; next}; 1' < zones.conf > new.conf

我尝试修改它以便接受变量,但没有结果:

#!/bin/bash
while read line
do
        awk -v OFS='\n\n' '/"'${line}'"/{n=4}; n {n--; next}; 1' zones.conf > new.conf

done<list.txt

提前致谢

3 个答案:

答案 0 :(得分:3)

使用sed

非常简单
 sed -i '/zone "domain.com"/,+4d' zones.conf

使用变量:

 sed -i '/zone "'$domain'"/,+4d' zones.conf

完整的工作示例:

#!/bin/bash
while read domain
do
    sed -i '/zone "'$domain'"/,+4d' zones.conf
done<list.txt

答案 1 :(得分:2)

我的sed解决方案是

sed '/zone "domain.com"/{:l1;/};\n$/!{N;bl1};d}' file > newfile 
#But the above would be on the slower end if you're dealing with 33k zones

对于就地编辑,请使用-i选项sed,如下所示:

sed -i.bak '/zone "domain.com"/{:l1;/};\n$/!{N;bl1};d}' file
#Above will create a backup of the original file with a '.bak' extension

使用变量

#!/bin/bash
while read domain #capitalized variables are usually reserved for the system
do
    sed '/zone "'"${domain}"'"/{:l1;/};\n$/!{N;bl1};d}' file > newfile
    # for inplace edit use below
    # sed -i.bak '/zone "'"${domain}"'"/{:l1;/};\n$/!{N;bl1};d}' file
done<list.txt

答案 2 :(得分:2)

您应该能够修改现有的awk命令,以便在找到匹配项后删除指定数量的行,例如:

awk -v OFS='\n\n' '/domain.com/{n=4}; n {n--; next}; 1' < zones.conf > new.conf

这会在找到初始domain.com后删除4行,为您提供正确的换行符。

<强>输出

zone "other.com" {
    type master;
    file "/etc/bind/db/other.com";
};


zone "foobar.com" {
    type master;
    file "/etc/bind/db/foobar.com";
};