como ler o valor do comando awk?

1

Eu tenho arquivo de resultado onde eu preciso ler o valor de "células rx" o arquivo de relatório é dado como abaixo: O conteúdo do arquivo test.log é o seguinte:

    co_result=test.log  

    ZyXEL IES-1000> statistics port 12 0 33
    [adsl channel 12-0/33]
    tx packets: 56
    rx packets: 60
    tx rate   : 0
    rx rate   : 0
    tx cells  : 468
    rx cells  : 1707
    errors    : 0
    ZyXEL IES-1000>

Estou usando o seguinte comando para ler o valor das células rx:

    cells=$(grep -e 'cells' $co_result | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0"";next;}1')
    echo "Var_value: $cells"

mas quando tentei executar os dois comandos acima em um arquivo. Estou recebendo a seguinte saída, onde os primeiros caracteres no eco não estão sendo exibidos:

       1707value: 530  

Estou esperando apenas 1707 em $ cells variável, mas imprime de forma errada. Eu não estou entendendo o assunto. Você poderia por favor ajudar a consertar isso?

    
por Nagesh HS 13.06.2018 / 10:46

2 respostas

2

Sua substituição de comando é desnecessariamente complexa.

Em vez disso:

cells=$( awk '/rx cells/ { print $NF }' <"$co_result" )
printf 'Var_value: %s\n' "$cells"

$NF será o último campo delimitado por espaço em branco na linha e será impresso se a linha contiver a string rx cells .

Verifique também se o arquivo de entrada é um arquivo de texto Unix e não um arquivo de texto do DOS. Execute dos2unix no arquivo para convertê-lo em um arquivo de texto Unix.

Olhando para o seu comando:

grep -e 'cells' $co_result | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0"";next;}1'

Primeiro: grep -e 'cells' $co_result falharia se $co_result contivesse um espaço ou tabulação ou nova linha ou qualquer outro caractere especial (desde que não tenha sido citado).

O comando gera

tx cells  : 468
rx cells  : 1707

Então: cut -d: -f2 . Isso gera

 468
 1707

Então: awk '{print $1}' . Isso gera o mesmo que acima, mas com os espaços iniciais removidos

Então: awk 'NR%2{printf $0"";next;}1' . Esta é uma maneira ofuscada de fazer paste -d' ' - - e saídas

468 1707

O echo mais tarde será exibido

Var_value: 468 1707

O motivo pelo qual você não entende isso é que seu arquivo de entrada é um arquivo de texto do DOS e contém retornos de linha no final de cada linha. Portanto, o cursor volta para o início da linha depois de imprimir 468 .

Use dos2unix no seu arquivo de entrada.

De onde você obtém 530 , não sei.

    
por 13.06.2018 / 10:57
1

Você poderia simplesmente usar grep :

 cells=$(grep -F "rx cells" "$co_result" | grep -oE "[0-9]+")

isso extrairia o número em sua variável por:

grep -F "rx cells" $co_result : isso está extraindo a linha que contém rx cells : 1707 e grep -oE "[0-9]+" : somente gera a correspondência da expressão regular que corresponde apenas ao número: 1707

Você também pode usar a substituição do grupo mais elequant sed para extrair o valor da seguinte forma:

cells=$(sed  -r -n 's/rx cells.*\W([0-9]+)//p' "$co_result")
  • -r : ative o regex estendido
  • -n : imprima apenas linha explícita
  • 's /// p': s para substituir, p para imprimir explicitamente a linha que corresponde ao padrão.
  • rx cells.*\W([0-9]+) match rx cells .*\W corresponde a qualquer caractere até que um caractere não pertencente à palavra e ([0-9] +) capture no grupo um ou mais dígitos.
  • substitui a saída pelo grupo um que contém n dígitos capturados.
por 13.06.2018 / 10:57