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?

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: 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

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

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}'

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.