![](/img/trans.png)
[英]How to use awk to insert multiple lines after first match of a pattern, in multiple files
[英]How to use awk to add multiple lines after pattern
我有一种情况,我试图使用使用awk找到一个模式,并在找到模式后立即添加10行内容。 我尝试使用下面但不起作用
输入iptable.txt文件的内容:
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
iptables.txt的输出应该是这样的
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
awk函数执行:
awk '/--dport 22 -j ACCEPT/{print $0 RS
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT"
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT"
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT"
} 1' > tmp && mv tmp /home/user/iptables.txt
简而言之,我想要完成的是当我执行上面的awk命令时,它应该使用行dport 20,21和23附加iptable.txt文件。
这可能是你正在寻找的:
$ awk '
{ print }
/--dport 22 -j ACCEPT/ { print \
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT" ORS\
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT" ORS\
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT"
}
' file
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
要么:
$ awk -v block='-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT' '
{ print }
/--dport 22 -j ACCEPT/ { print block }
' file
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
考虑到输入的重复性,您可以执行以下操作:
awk '/--dport 22 -j ACCEPT/ {n=$12; for(i=0; i<=10; i++) {$12=n++; print} next}1' input
另一方面,如果您的输入不是那么重复,那么sed
更适合这种情况。 如果要添加的10行位于名为new
的文件中,只需执行以下操作:
sed '/--dport 22 -j ACCEPT/rnew' input
命令r
使sed在与模式匹配的任何行之后读入指定的文件。 如果由于某种原因您不想从其他文件中读取行,您可以使用:
sed '/--dport 22 -j ACCEPT/a\
first line of new content\
2nd line of new content
' input
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.