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

6つのフィールドのいずれかが空の場合は、 ""またはNULL値を印刷したいと思います。たとえば、4番目のフィールドに出力がない場合は、次のような出力が必要です。

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

しかし、私が得た結果は次のとおりです。

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

どんなアドバイスでもとても役に立ちます。上記のように、予想される出力を得るためにどのLinuxコマンドを使用するかを意図しています。

ベストアンサー1

あなたのパラメータによると、tshark6つの特定のフィールドを出力しようとしていますが、そのうちの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

おすすめ記事