Alternativas para 'egrep -o “éxito | error | falla” <nombre de archivo> | ordenar | uniq -c '

8

En algún momento necesito verificar algunos registros y hago esto con este comando:

egrep -o "success|error|fail" <filename> | sort | uniq -c

Entrada de muestra:

test error on line 10
test connect success
test insert success
test started at 00:00
test delete  fail

Salida de muestra:

1 error
1 fail
2 success

Me gustaría saber si alguien sabe una manera de hacer esto con un comando más corto.

Antes de preguntar por qué me gustaría hacer esto con un comando diferente ... No hay una razón especial, solo tengo curiosidad :)

Wolfy
fuente

Respuestas:

4

Aquí está la awkforma de hacerlo.

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

Pero todos estos revestimientos serán un poco más largos que nuestros viejos grep

devav2
fuente
4

No, creo que eres tan bueno como se pone. Naturalmente, puedes hacerlo con un script perl,

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

... pero es más complejo y menos intuitivo.

enero
fuente
Agregué una entrada de muestra a mi pregunta ... Espero que ahora sea más claro lo que hace el comando ... disculpen las molestias
Wolfy
1
OK, modifiqué el perl oneliner en consecuencia. Sigo pensando que su solución con egrep es mejor y más intuitiva.
Enero
2

No es mucho más corto, pero como realmente no necesita la expresión regular, hay fgrep( grep -F)

fgrep 'success
error
fail' "$filename" | sort | uniq -c

Otra forma de escribir lo mismo en bash:

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c
kojiro
fuente
1

Puede escribir un script bash simple y luego llamar al script, como:

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

y guárdelo como (por ejemplo) myscript.sh. Luego haz un chmod +x myscript.shy puedes llamarlo así myscript.sh <filename>.

jeremija
fuente
Pero en este caso el comando es el mismo ... acabas de crear un script que llama al comando ...
Wolfy
Pensé que solo querías acelerar el trabajo de tus registros. Solo por curiosidad, ¿por qué quieres un comando alternativo si el que ya proporcionaste hace un buen trabajo por ti?
jeremija
como dije: Tengo curiosidad por saber cómo los demás hacen algo así ... muchas veces me di cuenta de que las personas conocen una manera elegante y agradable de hacer las cosas y me encanta aprender ahora formas de hacer las cosas ...
Wolfy
2
En ese caso, usted es esa persona :-) Su línea de comando es agradable, breve, clara y explota el poder de la línea de comando de Unix. ¿Qué más desear?
enero
0

Su comando, aunque breve y dulce, es una forma bastante tortuosa de contar las ocurrencias de un término. Probablemente tomaría el enfoque directo y directo y usaría el indicador -c de grep (que hace exactamente eso) dentro de un ciclo de shell:

for i in success test fail; do echo `grep -c $i <filename>` $i; done

No tan corto, no tan emocionante, potencialmente más rápido para grandes archivos de registro (no sort). Yo diría que es un lavado.

Ternario
fuente
-1

Esta podría ser una respuesta ficticia, pero creo que, en este caso, sortes bastante inútil; tal vez puedas omitirlo. Sin embargo, aquí estamos usando tres comandos diferentes para tres acciones diferentes.

Podemos acortarlo si se puede llegar a algunos de ellos con alguna opción grep, pero no veo cuál ... :)

Alessio Tomelleri
fuente
2
No, no lo es, de lo contrario, uniq contará solo instancias consecutivas de términos de búsqueda. Por ejemplo, si tiene éxito, éxito, fracaso, éxito, entonces la salida de uniq será 2 success 1 fail 1 success.
Enero
está bien ... sry
Alessio Tomelleri