如果 awk 输出中不存在值,则想要打印 NULL

如果 awk 输出中不存在值,则想要打印 NULL

我正在尝试使用 awk 打印 tshark 命令输出,下面是我的命令:

tshark -r "test.pcap" -odiameter.tcp.ports:"1234" -R 'diameter.cmd.code == 272 and diameter.flags.request==0 and !tcp.analysis.retransmission and diameter.flags.T == 0' -Tpdml -Tfields -ediameter.Session-Id -ediameter.CC-Request-Type -ediameter.Result-Code -ediameter.Validity-Time  -ediameter.Unit-Quota-Threshold -ediameter-Value-Digits | awk '{print $1":"$2":"$3":"$4":"$5":"$6}'

输出:

xyz.test.com:1:2001:300:400:1234

如果六个字段中的任何一个为空,我想打印“”或 NULL 值。例如,如果第四个字段没有输出,我需要如下输出:

 xyz.test.com:1:2001::400:1234

但我得到的输出为:

xyz.test.com:1:2001:400:1234:

任何建议都会非常有用。我愿意使用任何 Linux 命令来获得如上所述的预期输出。

答案1

根据您的tshark参数,我猜测您正在尝试输出 6 个特定字段,其中之一为空。 tshark默认情况下使用制表符作为分隔符,因此输出将包含两个连续的制表符(表示缺少值)。 awk但是,默认情况下将多个制表符/空格视为一个字段分隔符 - 因此它不会执行您所期望的操作。

解决方案是在 awk 中指定单个字段分隔符。

请参见示例,模拟输出中缺少值“4”:

$ printf "1\t2\t3\t\t5\t6\n"
1   2   3      5  6

默认情况下,AWK 将两个选项卡视为一个字段分隔符,从而导致:

$ printf "1\t2\t3\t\t5\t6\n" \
        | awk '{print $1":"$2":"$3":"$4":"$5":"$6}'
1:2:3:5:6:

你想要的可能是这样的:

$ printf "1\t2\t3\t\t5\t6\n" \
      | awk -v FS='\t' '{print $1":"$2":"$3":"$4":"$5":"$6}'
1:2:3::5:6

相关内容