Agregar números del resultado de un grep

23

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?

Amir Afghani
fuente

Respuestas:

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

Eso no imprime la lista pero sí 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 }'
Shawn J. Goff
fuente
Shawn: gracias por tu respuesta. ¿Cómo devuelvo el total al script bash de awk?
Amir Afghani
2
@Amir Usarías el primero como este variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')Esto pone la salida del comando (que es solo el valor de la suma) en la variable llamadavariable
Shawn J. Goff el
3
@Amir Afghani Además, es posible que desee cambiar su grep a "[0-9]\+ errors". Esto coincidirá si tiene una línea que informa> 9 errores.
Shawn J. Goff
Sí, wow, no puedo creer que me haya perdido eso. Gracias.
Amir Afghani
Shawn, el resultado parece que no está sumando mis resultados. Se ve así: Errores totales = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir Afghani
8

Todo esto también se puede hacer en awk:

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

Parece que está utilizando el sistema GNU , por lo que si el soporte de expresiones regulares de Perl está disponible, podría 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 que GNU awk ):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile
Dimitre Radoulov
fuente
el primero para mí solo imprime lo que ya entró en la tubería ...
Xerus
3

Intente conectar la salida de su grep a

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

fuente
2

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. Por lo general, uso una función de 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.

diáconos
fuente