我正在尝试使用 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