我的配置文件中有行:
#-A FORWARD -i eth2 -j ACCEPT
#-A FORWARD -m physdev --physdev-in eth0 -j DROP
#-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -m physdev --physdev-in eth0 -j DROP
-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -i br0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
具有'physdev'字符串的行是我的兴趣,并且想要对此文件应用(sed)规则,以便规则必须忽略具有'physdev'字符串的注释行并删除具有'physdev'字符串的未注释行。你能否建议一个sed删除模式或任何awk模式。
答案 0 :(得分:1)
假设:
$ cat file
#-A FORWARD -i eth2 -j ACCEPT
#-A FORWARD -m physdev --physdev-in eth0 -j DROP
#-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -m physdev --physdev-in eth0 -j DROP
-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -i br0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
你可以这样做:
$ awk '$1~/^#/{print; next} /physdev/{next} 1' file
#-A FORWARD -i eth2 -j ACCEPT
#-A FORWARD -m physdev --physdev-in eth0 -j DROP
#-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -i br0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
答案 1 :(得分:1)
所以,如果你想删除所有未注释的行containsig physdev(这就是你想要的,对吗?),sed至少和awk一样优雅:
sed -e '/^[^#].*physdev/d' file
如果您希望将更改写入文件,请使用sed -i -e ...
答案 2 :(得分:0)
sed -e '/^#/n;/physdev/d' file
/^#/n
只需前进到输入的下一行,一行以#
开头
这具有在/^#/
匹配时忽略所有后续sed命令的效果。因此,如果您知道您始终希望保留以#
开头的所有行,则无论后续命令获得多少或多复杂,使/^#/n
第一个命令都会这样做。