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

标签 linux bash awk tcp

我有这样一种情况,我试图使用 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 命令时,它应该在 iptable.txt 文件中附加 dport 20、21 和 23 行。

最佳答案

这可能是您正在寻找的:

$ 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

关于linux - 如何使用 awk 在模式后添加多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38543374/

相关文章:

linux - 限制 Linux 中用户可用的内存和 cpu

linux - 如何从另一台机器监视一堆 Ubuntu 机器的 CPU 使用情况?

linux - Shell 脚本,回显消息后在同一行读取

linux - awk 根据条件打印特定列

c - 如何在源代码外模式下使用 cmake 构建 zlib?

Linux 命令行 - 按第一行字符计数的文件

windows - 如何将文本从 Windows 中的 Firefox 复制到 Unix 中的 bash shell?

bash while循环只读一行

linux - (g)awk 似乎会缓存 shell 命令的输出 - 如何避免这种情况?

bash - 如何使用 AWK 格式化字符串日期(带有文本和毫秒)