Múltiplas entradas em um comando [closed]

3

Eu tenho algo assim:

Error_code=1; num=5;
Error_code=2; num=7;
Error_code=3; num=9;
Error_code=1; num=2;
Error_code=2; num=5;

. .

E muitos códigos de erro (cerca de 100). Suponha que o arquivo seja chamado performance.log

Como posso usar um comando? Cada vez que o código de erro é diferente. Eu tenho algo assim:

grep -i "error_code=$x;" performance.log | \
   awk -F";" '{print $2}' > $x_error_code.txt

Portanto, cada vez, a variável x é um novo valor definido a partir do código de erro e, quando os códigos de erro terminarem, o script será concluído.

    
por Ammar Akkad 28.03.2017 / 00:36

3 respostas

1

Um script awk pode fazer tudo isso. Isso também pode ser feito com o shell script Bourne puro, como este abaixo:

grep -E -o '[[:digit:]]+; num=[^;]+' performance.log \
| while IFS="; " read n num; do
    echo "$num" >> "${n}_error_code.txt"
done

A parte grep extrai a subcadeia " EEE; num=NNN " das suas linhas " Error_code=EEE; num=NNN; ". O loop while lê EEE e num=NNN e escreve o último em EEE_error_code.txt

Se você estiver interessado em apenas um código de erro específico (EEE abaixo), você pode alterar o comando grep para:

grep -E -o '\<EEE; num=[^;]+' performance.log | while ...

Se você estiver interessado em um pequeno conjunto de códigos de erro (EEE1 ... EEEn abaixo), você pode alterar o comando grep para:

grep -E -o '\<(EEE1|EEE2|...|EEEn); num=[^;]+' performance.log | while ...
    
por 28.03.2017 / 01:17
1
sed -n "/Error_code=$x/s/^[^ ]* //p" > $x_error_code.txt
    
por 28.03.2017 / 04:10
0

Eu faria isso apenas com o awk.

Este irá escanear o arquivo e gerar um arquivo por tipo de erro

$ ex="";awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k] >k"error_code.txt"}' performance.log

Se você quiser "excluir" alguns erros, você pode ajustar o valor da variável shell de acordo com ex="2|3" (excluir 2 ou 3)

Teste:

$ echo "$c"
Error_code=1; num=5;
Error_code=2; num=7;
Error_code=3; num=9;
Error_code=1; num=2;
Error_code=22; num=5;

$ ex="";echo "$c" |awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k],k}'
 num=5
 num=2 1

 num=7 2

 num=9 3

 num=5 22

$ ex="22|1";echo "$c" |awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k],k}'

 num=7 2

 num=9 3

Por outro lado, se você quiser combinar padrões específicos em vez de excluir padrões, poderá fazer o seguinte:

$ inc="1";awk -F"[;=]" -v inc=$inc '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k~inc || inc=="") print a[k] >k"error_code.txt"}' performance.log 

Aplique a var inc (incluir) os códigos de erro que deseja imprimir ou deixe-os vazios para incluir todos os erros. ( inc="" )

    
por 28.03.2017 / 03:20