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
귀하의 매개변수에 따르면 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