Deseja imprimir NULL se o valor não estiver presente como saída awk

1

Eu estou tentando imprimir uma saída de comando tshark usando awk abaixo é o meu comando:

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}'

Saída:

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

Se algum dos seis campos estiver vazio, eu quero imprimir "" ou valor NULL. Por exemplo, se não houver saída para o quarto campo, preciso de saída como abaixo:

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

Mas estou recebendo a saída como:

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

Qualquer sugestão será muito útil. Estou aberto para usar qualquer comando linux para obter a saída esperada como mencionado.

    
por pankmish 01.12.2015 / 17:39

1 resposta

1

Com base nos seus parâmetros tshark , acredito que você esteja tentando produzir 6 campos específicos e um deles está vazio. Por padrão, tshark usa um caractere TAB como separador, portanto, a saída conterá dois caracteres TAB consecutivos (indicando um valor ausente). awk no entanto, por padrão, trata vários separadores / espaços como um separador de campos - portanto, não faz o que espera.

A solução é especificar um único caractere separador de campos no awk.

Veja o exemplo, o valor "4" está faltando na saída simulada:

$ printf "1\t2\t3\t\t5\t6\n"
1   2   3      5  6

Por padrão, o AWK trata as duas guias como um separador de campo, resultando em:

$ printf "1\t2\t3\t\t5\t6\n" \
        | awk '{print $1":"$2":"$3":"$4":"$5":"$6}'
1:2:3:5:6:

O que você quer é provavelmente isso:

$ printf "1\t2\t3\t\t5\t6\n" \
      | awk -v FS='\t' '{print $1":"$2":"$3":"$4":"$5":"$6}'
1:2:3::5:6
    
por 27.12.2015 / 02:27