![如果 awk 输出中不存在值,则想要打印 NULL](https://linux22.com/image/78538/%E5%A6%82%E6%9E%9C%20awk%20%E8%BE%93%E5%87%BA%E4%B8%AD%E4%B8%8D%E5%AD%98%E5%9C%A8%E5%80%BC%EF%BC%8C%E5%88%99%E6%83%B3%E8%A6%81%E6%89%93%E5%8D%B0%20NULL.png)
我正在尝试使用 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