我正在删除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
提前致谢
答案 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";
};