在同一行中打印来自两个不同模式的匹配正则表达式值

时间:2018-08-19 16:33:30

标签: bash awk sed grep

所以我遇到了一个复杂的匹配问题,我试图通过Tcpdump输出执行该操作。

从我收到的输出行中,我只想获得两个正则表达式匹配的模式值,但是问题是它们没有回答相同的正则表达式模式。

当我将整个输出写入文件然后进行grepping时,有时会丢失某些值,这就是我想即时获取值的方式。

我正在执行的命令是:

tcpdump -U -n -i eth2 -v -e -s 1500 '((port 67 or port 68) and (udp[247:4] = 0x63350101))'

我的两个正则表达式:

1)grep -Eo '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2} >' | awk '{print$1}'

2)grep -Eo 'Request from ([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | awk '{print$3}'

示例输出:

14:29:16.832592 00:00:00:00:00:00 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 303: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 289) 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 11:11:11:11:11:11, length 261, xid 0x4eb03662, Flags [Broadcast]

我需要的输出(附加到文件):00:00:00:00:00:00, 11:11:11:11:11:11

谢谢!

1 个答案:

答案 0 :(得分:1)

这是您需要的吗?

$ awk -v FPAT='([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' -v OFS=', ' '{print $1, $3}' file
00:00:00:00:00:00, 11:11:11:11:11:11

上面的代码将GNU awk用于FPAT,仅从与给定regexp匹配的每条输入行中打印第一和第三字符串。如果您输入的内容不是您向我们展示的其他内容,并且您不希望打印这些内容,请对其进行调整,例如:

awk -v FPAT='...' -v OFS=', ' 'NF==3{print $1, $3}' file