Encuentre todas las líneas que contienen cadenas: resúmalas y cuéntelas

Encuentre todas las líneas que contienen cadenas: resúmalas y cuéntelas

Tengo muchos archivos en varias subcarpetas que incluyen una cadena type="abc_(no estoy muy seguro de cuántas variantes abc_hay), por lo que quiero saber cuántas apariciones de lo desconocido type="abc_hay en mis archivos.

Espero obtener algo que sea como una línea que contenga

"type="abc_0815 found 50 times
"type="abc_0816 found 32 times
...

and so on.

Si me gusta eso:

grep -rni 'type="abc_' * | wc

Ya conozco sus 14905 apariciones con type="abc_.

¿Alguien puede ayudarme con eso?

Respuesta1

Esto se utiliza findpara obtener una lista de archivos, se la pasa caty analiza la salida con awk:

find . -type f |
xargs -I xx cat "xx" | awk '/type="abc_/{
  for(i=1;i<=NF;i++){
    if($i~/type="abc_/){ d[$i]++ } } } 
  END{ for(i in d){ print i"\tfound",d[i],"times." } }'

type="abc_4  found 1 times.
type="abc_3  found 2 times.
type="abc_6  found 1 times.
type="abc_2  found 2 times.
type="abc_10 found 3 times.
type="abc_5  found 1 times.

Utiliza buscar en lugar de un simple cat *para ser más flexible sobre qué buscar.

xargs .. cat | ..se puede acortar confind . -type f -exec cat {} + | awk ..

Respuesta2

simplemente agregue -cla bandera para que grep la cuente por usted.

En caso de que haya demasiados resultados 0, filtre con awk

  grep -rnic 'type="abc_' * | awk -F: '$NF>0' 

Respuesta3

Prueba algo parecido a esto:

grep -rni 'type="abc_' * |sed -n "s/.*\(abc_[0-9]*\).*/\1/p"|uniq -c| sed  "s/\(.*\)\(abc.*\)/\2 found \1 times/"

información relacionada