
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
6つのフィールドのいずれかが空の場合は、 ""またはNULL値を印刷したいと思います。たとえば、4番目のフィールドに出力がない場合は、次のような出力が必要です。
xyz.test.com:1:2001::400:1234
しかし、私が得た結果は次のとおりです。
xyz.test.com:1:2001:400:1234:
どんなアドバイスでもとても役に立ちます。上記のように、予想される出力を得るためにどのLinuxコマンドを使用するかを意図しています。
答え1
あなたのパラメータによると、tshark
6つの特定のフィールドを出力しようとしていますが、そのうちの1つが空のようです。
tshark
デフォルトでは、タブは区切り文字として使用されるため、出力には2つの連続したタブ(欠落値を示す)が含まれます。
awk
ただし、複数のタブ/スペースはデフォルトで1つのフィールド区切り文字として扱われるため、期待どおりに機能しません。
解決策は、awkで単一フィールド区切り文字を指定することです。
シミュレーション出力で値「4」が欠落している例を参照してください。
$ printf "1\t2\t3\t\t5\t6\n"
1 2 3 5 6
デフォルトでは、AWK は 2 つのタブを 1 つのフィールド区切り文字として扱い、次の結果を取得します。
$ 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