如何使用awk在模式后添加多行

时间:2016-07-23 15:26:12

标签: linux bash awk tcp

我有一种情况,我试图使用awk来找到一个模式,并在找到模式后立即添加10行内容。我尝试使用以下但不起作用

输入iptable.txt文件的

内容:

<%= put_code %>

iptables.txt的输出应该看起来像

Couldn't find GooglePrettifyRailsHelper, expected it to be defined in helpers/google_prettify_rails_helper.rb
执行awk函数:

-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

简而言之,我想要完成的是当我执行上面的awk命令时,它应该使用行dport 20,21和23附加iptable.txt文件。

2 个答案:

答案 0 :(得分:2)

这可能是您正在寻找的:

$ 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

答案 1 :(得分:1)

考虑到输入的重复性,您可以执行以下操作:

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