我有一种情况,我试图使用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文件。
答案 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