it-swarm-es.com

Agregar números del resultado de un grep

Ejecuto el siguiente comando:

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

y obtengo el siguiente resultado:

1
4
0
8

Me gustaría agregar cada uno de los números a una variable de conteo continuo. ¿Hay un revestimiento mágico que alguien pueda ayudarme a construir?

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

Eso no imprime la lista pero imprime la suma. Si desea tanto la lista como la suma, puede hacer:

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

Todo esto también se puede hacer en awk:

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

Parece que está utilizando el sistema GNU , por lo que si está disponible el soporte Perl expresiones regulares, puede escribir algo como esto:

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

PD Modifiqué la expresión regular (agregué el cuantificador +) para permitir números> 9.

PD Alternativamente, awk es suficiente (suponiendo GNU awk):

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

Yo uso esto:

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

No es eficiente para listas grandes, pero para la mayoría de mis casos de uso está bien. Usualmente uso una función Shell para automatizar el proceso, de modo que solo tengo que proporcionar un nombre de archivo:

## 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; }

Siempre puede sustituir el marcador de fin de línea por un separador de elemento específico o una clase de caracteres si sus datos están delimitados de otra manera.

3
deaks

Intente conectar la salida de su grep a

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