it-swarm-pt.tech

Adicionando números do resultado de um grep

Eu executo o seguinte comando:

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

e recebo o seguinte resultado:

1
4
0
8

Eu gostaria de adicionar cada um dos números até uma variável de contagem em execução. Existe um liner mágico que alguém possa me ajudar a construir?

24
Amir Afghani
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'

Isso não imprime a lista, mas imprime a soma. Se você deseja a lista e a soma, pode fazer:

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'
34
Shawn J. Goff

Isso também pode ser feito no awk:

awk '"[0-9]+ errors" {sum += $1}; END {print sum}' verification_report_3.txt
8
Trey Hunner

Parece que você está usando o sistema GNU , portanto, se o suporte a expressões regulares Perl estiver disponível, você pode escrever algo como isto:

grep -Po '[0-9]+(?=\s+errors)' infile | 
  paste -sd+ | 
    bc

P.S. Modifiquei a expressão regular (adicionei o quantificador +) para permitir números> 9.

P.S. Como alternativa, o awk é suficiente (assumindo GNU awk):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile
6
Dimitre Radoulov

Eu uso isso:

$ echo $(cat file | sed 's/$/+/') 0 | bc

Não é eficiente para grandes listas, mas para a maioria dos meus casos de uso é bom. Eu costumo usar uma função Shell para automatizar o processo, de modo que só preciso fornecer um nome de arquivo:

## cheezy summation
##   call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }

Você sempre pode substituir o marcador de fim de linha por um separador de elemento específico ou classe de caractere se seus dados forem delimitados de outra maneira.

3
deaks

Tente canalizar a saída do seu grep para o

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'
3
user591