【问题标题】:How to use awk to add multiple lines after pattern如何使用awk在模式后添加多行
【发布时间】:2016-11-27 08:33:35
【问题描述】:

我有一种情况,我尝试使用 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 行。

【问题讨论】:

    标签: linux bash awk tcp


    【解决方案1】:

    这可能就是你要找的:

    $ 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
    

    【讨论】:

    • 抱歉造成混淆 - find 不应该是命令(anubhava 是这么认为的,所以他将其编辑为命令)!我的意思是找到一个匹配 -dport 22 的模式并在它下面添加其余的行块 - 它应该对 iptables.txt 进行永久编辑,并使用行块。
    • 谢谢 Ed - 感谢它,它只在命令 shell 上打印,但不会在实际的 iptable.txt 文件中附加这三行。我需要附加到该特定文件的原因是我计划运行一个 shell 脚本来更新不同的其他设置并更新这个特定文件。甚至可以在 shell 脚本上使用 awk 函数吗?
    • @GanSe - 您的术语令人困惑。我上面发布的不是 awk 函数,而是 awk 脚本。当您执行它时,它是一个在 shell 脚本中使用的 awk 脚本。使用任何 UNIX 命令 cmd 写回原始文件,您只需执行 cmd file > tmp && mv tmp file。使用 GNU awk 4.0 和更新版本,您可以改为使用awk -i inplace 'script' file,而使用 GNU sed 您可以使用sed -i 'script' file。希望这是有道理的,如果不能随意提出更多问题。
    • @GanSe 我看到你不接受我的回答。毕竟它不适合你吗?
    • 你的工作也很好——我接受了你和威廉的回答。 sed 更容易合并到脚本中,我使用了那个。我刚刚注意到,当我接受他的回答时,你的回答没有被接受。我如何同时接受?
    【解决方案2】:

    鉴于您输入的重复性,您可以执行以下操作:

    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
    

    【讨论】:

    • 谢谢威廉 - 我在尝试 awk 之前尝试了 sed。 sed 抱怨'-'(破折号),当我试图逃避 \ 时,它抱怨'\'。
    • @GanSe 你能准确地展示你尝试过的 sed 抱怨的内容吗?以及哪个版本的 sed。
    猜你喜欢
    • 2012-03-24
    • 2021-04-21
    • 2018-12-05
    • 2018-04-15
    • 2017-06-16
    • 1970-01-01
    • 2016-09-15
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多