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 값을 인쇄하고 싶습니다. 예를 들어 네 번째 필드에 출력이 없으면 다음과 같은 출력이 필요합니다.

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

그러나 내가 얻는 결과는 다음과 같습니다.

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

어떤 조언이라도 매우 도움이 될 것입니다. 위에서 언급한 대로 예상되는 출력을 얻기 위해 어떤 Linux 명령이든 사용할 의향이 있습니다.

답변1

귀하의 매개변수에 따르면 tshark6개의 특정 필드를 출력하려고 하는데 그 중 하나가 비어 있는 것 같습니다. 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

관련 정보