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

时间:2017-10-26 21:25:09

标签: linux bash awk

我想通过冒号使用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 '/^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

但我想从22中获取$7而不是dpt:22

我尝试过使用awk的字段分隔符,但我可以弄清楚如何使它只适用于单个变量

5 个答案:

答案 0 :(得分:4)

只需调整FS以包含:

$ 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]*'

答案 1 :(得分: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:]:]+'将输入字段分隔符设置为空格或冒号之一。

答案 2 :(得分: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

答案 3 :(得分: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

中的所有非数字字符

答案 4 :(得分:0)

awk有一个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 }' 函数,使用指定的分隔符regexp(参数3)将字符串(参数1)分解为字段数组(参数2)。

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

images:[
                                    ['img1',false,[1,2,3],1,0],//4th one is zindex
                                    ['img2',false,[2,3,1],2,0],
                                    ['img3',false,[4,5],3,10],
                                    ['img4',false,[1,2,3],4,0],
                                    ['img5',false,[2,3,1],5,0],
                                    ['img6',false,[5],6,0],
                                    ['img7',false,[1,2,3],7,0],
                                    ['img8',false,[2,3,1],8,0],
                                    ['img9',false,[5],9,0],
                                    ['img10',false,[1,2,3],10,0],
                                    ['img11',false,[2],11,10],
                                    ['img12',false,[5],12,10]
                              ],