如何在awk中使用多个分隔符?

6

我希望能够使用awk按冒号拆分变量,但只拆分最后一个变量。

以下是输入内容:

 ACCEPT     tcp  --  0.0.0.0/0     0.0.0.0/0     tcp dpt:22

我希望得到以下输出:
 protocol=tcp source=0.0.0.0/0 destination=0.0.0.0/0 port=22

这是我的awk命令:

现在这个awk命令:

 awk '/^ACCEPT/ {print "protocol=",$2, "source=",$4,"destination=",$5,"port=",$7}"

这将产生:

protocol=tcp source=0.0.0.0/0 destination=0.0.0.0/0 port=dpt:22

但是我希望从$7中获取22,而不是dpt:22

我尝试使用awk的字段分隔符,但是我不知道如何只应用于一个变量


没有分号。: 是冒号,; 是分号。 - Barmar
你尝试过使用split()函数吗?函数名就在你的问题标题中。 - Barmar
可能是[AWK多个分隔符]的重复问题(https://dev59.com/c2ct5IYBdhLWcg3wSbjY)。 - jww
5个回答

5
只需调整文件系统以包含“:”即可。
$ echo 'ACCEPT     tcp  --  0.0.0.0/0     0.0.0.0/0     tcp dpt:22' |
     awk '/^ACCEPT/{printf("protocol=%s source=%s destination=%s port=%s\n", $2,$4,$5,$8)}
     ' FS='[ :]*'
protocol=tcp source=0.0.0.0/0 destination=0.0.0.0/0 port=22

你可能需要包含制表符,并执行FS='[ :\t]*'

2
您可以使用正则表达式在 awk 中定义自定义字段分隔符。
some_command | awk -F '[[:blank:]:]+' '/^ACCEPT/{
   printf "protocol=%s source=%s destination=%s port=%s\n", $2, $4, $5, $NF}'

protocol=tcp source=0.0.0.0/0 destination=0.0.0.0/0 port=22

-F '[[:blank:]:]+'将输入字段分隔符设置为空格或冒号之一。


1
使用以下的awk方法:
awk '{ printf "protocol=%s source=%s destination=%s port=%s\n",$2,$4,$5,substr($7,5) }' file

但是如果最后一个字段具有动态的前缀长度,您可以使用gsub()函数删除非数字字符:

awk '{ gsub(/^[^0-9]+/,"",$7); printf "protocol=%s source=%s destination=%s port=%s\n",$2,$4,$5,$7 }' file

1

在您的awk命令中进行轻微修改

$ awk '/^ACCEPT/ {gsub(/[^0-9]/,"",$7); print "protocol="$2, "source="$4,"destination="$5,"port="$7}' file
protocol=tcp source=0.0.0.0/0 destination=0.0.0.0/0 port=22

gsub(/[^0-9]/,"",$7);将使$7中所有非数字字符无效。


0

awk有一个split函数,可以使用指定的分隔符正则表达式(参数3)将字符串(参数1)拆分为字段(参数2)的数组。

以下awk程序将扫描所有iptables选项(从第6个字段到行的最后一个字段),而不是依赖于dpt:###成为第7个字段。

awk '/^ACCEPT/ {
                 port="???"
                 for (i=6; i<=NF; i++) {
                   if (split($i, opt, ":")==2 && opt[1]=="dpt") {
                      port=opt[2]
                   }
                 }
                 print "protocol=" $2, "source=" $4, "destination=" $5, "port=" port
               }'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接