2008-12-16 7 views
225

Tengo un montón de archivos de registro. Necesito averiguar cuántas veces ocurre una cadena en todos los archivos.Cuente todas las apariciones de una cadena en muchos archivos con grep

grep -c string * 

vuelve

... 
file1:1 
file2:0 
file3:0 
... 

Uso de una tubería que era capaz de obtener sólo los archivos que tienen una o más ocurrencias:

grep -c string * | grep -v :0 

... 
file4:5 
file5:1 
file6:2 
... 

¿Cómo puedo obtener sólo el recuento combinado? (Si devuelve file4:5, file5:1, file6:2, quiero volver 8.)

+0

¿Me puede decir lo que el grep -v: 0 hace? . Sé que cuenta para archivos que tienen ocurrencias mayores que 0. ¿Qué significa la opción -v y "0"? Amablemente hágamelo saber. –

+0

@GauthamHonnavara grep: 0 busca una línea que coincida con la cadena: 0. -v es una opción para invertir esa búsqueda; en su lugar, usar grep -v: 0 significa encontrar todas las líneas que no contienen: 0, por lo que una línea con file4: 5 y file27: 193 pasaría porque no contienen: 0 – penguin359

Respuesta

230
cat * | grep -c string 
+7

Tiene la misma limitación que cuenta varias ocurrencias en una línea solo una vez. Sin embargo, supongo que este comportamiento está bien en este caso. –

+0

@Michael Haren Sí, podría haber una sola aparición de cuerda en una línea. –

+2

Prefiero hacer 'grep -c string <*' Así que simplemente reemplazando el espacio con un menos de. –

19

En lugar de usar -c, simplemente páselo a wc -l.

grep string * | wc -l 

Esto mostrará cada aparición en una sola línea y luego contará el número de líneas.

Sin embargo, fallarán los casos en que la cadena se repite dos o más veces en una línea.

+2

Tubería a "wc -l" también funciona muy bien junto con "grep -r 'test". que escanea recursivamente todos los archivos para la cadena 'prueba' en todos los directorios debajo del actual. – nottinhill

13
cat * | grep -c string 

una de las raras aplicaciones útiles de cat.

256

Esto funciona para múltiples ocurrencias por línea:

solución
grep -o string * | wc -l 
+2

Esto también funciona: 'grep -o cadena * --exclude-dir = some/dir/one/--exclude-dir = some/dir/two | wc -l'. –

+2

'grep -ioR string * | wc -l' es lo que utilizo para hacer una búsqueda insensible a mayúsculas, recursiva y de solo coincidencia – LeonardChallis

+0

Ésta muestra los archivos relevantes y luego el recuento total de coincidencias: 'grep -rc test. | awk -F: '$ NF> 0 {x + = $ NF; $ NF = ""; print} END {print "Total:", x} '' – Yaron

6

obligatorio AWK:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}' 

tenga cuidado si los nombres de archivo incluyen ":" sin embargo.

5

La solución AWK que también maneja los nombres de archivo que incluye dos puntos:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}' 

Tenga en cuenta que este método todavía no hace encuentran múltiples ocurrencias de string en la misma línea.

23
grep -oh string * | wc -w 

contará múltiples ocurrencias en una línea

+14

'grep -oh" ... mi curry era fuerte "* >> wc' :) – icc97

9

Algo diferente que todas las respuestas anteriores:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' * 
+0

Me alegro de ver un enfoque que no usa grep, esp como mi grep (en Windows) no admite la opción -o. –

5

Puedes añadir -R para buscar de forma recursiva (y no usar cat) y -I ignorar archivos binarios

grep -RIc string . 
0

Otro oneliner que utiliza funciones básicas de línea de comando para manejar múltiples ocurrencias por línea.

cat * |sed s/string/\\\nstring\ /g |grep string |wc -l 
1

Aquí es una manera más rápida de lo grep AWK alternativa de hacer esto, que se ocupa de varios partidos de <url> por línea, dentro de una colección de archivos XML en un directorio:

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml 

Estos trabajos bien en los casos en que algunos archivos XML no tienen saltos de línea.

0

Puede usar un simple grep para capturar el número de ocurrencias efectivamente. Usaré la opción -i para asegurarme de que STRING/StrING/string se capture correctamente.

línea

comando que da nombre a los archivos:

grep -oci string * | grep -v :0 

línea de comandos que elimina los nombres de archivos y copias 0 si hay un archivo sin ocurrencias:

grep -ochi string * 
+0

¿Podría elaborar más su respuesta agregando un poco más de descripción sobre la solución que proporciona? – abarisone

1

Grep única solución que he probado con grep para ventanas:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files" 

Esta solución contará todas las instancias es incluso si hay múltiples en una línea. -r busca de manera recursiva en el directorio, -o "mostrará solo la parte de una línea que coincida con PATTERN" - esto es lo que divide múltiples ocurrencias en una sola línea y hace que grep imprima cada coincidencia en una nueva línea; luego canalice esos resultados separados por línea nueva a grep con -c para contar el número de ocurrencias usando el mismo patrón.

2

corta recursiva variante:

find . -type f -exec cat {} + | grep -c 'string' 
Cuestiones relacionadas