texto - Cuente todas las apariciones de una cadena en muchos archivos con grep
grep varios patrones (15)
Algo diferente a todas las respuestas anteriores:
perl -lne ''$count++ for m/<pattern>/g;END{print $count}'' *
Tengo un montón de archivos de registro. Necesito saber cuántas veces se produce una cadena en todos los archivos.
grep -c string *
devoluciones
...
file1:1
file2:0
file3:0
...
Usando una tubería solo pude obtener archivos que tienen una o más ocurrencias:
grep -c string * | grep -v :0
...
file4:5
file5:1
file6:2
...
¿Cómo puedo obtener solo el recuento combinado? (Si devuelve file4:5, file5:1, file6:2
, quiero recuperar 8.)
Aquí hay una forma alternativa más rápida que grep AWK de hacer esto, que maneja múltiples coincidencias 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
Esto funciona bien en casos donde algunos archivos XML no tienen saltos de línea.
En lugar de usar -c, simplemente canalícelo a wc -l.
grep string * | wc -l
Esto enumerará cada aparición en una sola línea y luego contará el número de líneas.
Sin embargo, esto perderá las instancias en las que la cadena aparezca 2+ veces en una línea.
Esto funciona para múltiples apariciones por línea:
grep -o string * | wc -l
La solución AWK que también maneja nombres de archivos incluyendo dos puntos:
grep -c string * | sed -r ''s/^.*://'' | awk ''BEGIN{}{x+=$1}END{print x}''
Tenga en cuenta que este método aún no encuentra múltiples apariciones de string
en la misma línea.
Otro oneliner que usa funciones de línea de comando básicas que manejan múltiples apariciones por línea.
cat * |sed s/string////nstring/ /g |grep string |wc -l
Puede agregar -R
para buscar recursivamente (y evitar usar cat) e -I
para ignorar archivos binarios.
grep -RIc string .
Puede usar un grep
simple para capturar el número de ocurrencias de manera efectiva. STRING/StrING/string
la opción -i
para asegurarme de que STRING/StrING/string
se capturen correctamente.
Línea de comando que da el nombre de los archivos:
grep -oci string * | grep -v :0
Línea de comando que elimina los nombres de archivo e imprime 0 si hay un archivo sin incidencias:
grep -ochi string *
Si desea un número de apariciones por archivo (ejemplo para la cadena "tcp"):
grep -RIci "tcp" . | awk -v FS=":" -v OFS="/t" ''$2>0 { print $2, $1 }'' | sort -hr
Ejemplo de salida:
53 ./HTTPClient/src/HTTPClient.cpp
21 ./WiFi/src/WiFiSTA.cpp
19 ./WiFi/src/ETH.cpp
13 ./WiFi/src/WiFiAP.cpp
4 ./WiFi/src/WiFiClient.cpp
4 ./HTTPClient/src/HTTPClient.h
3 ./WiFi/src/WiFiGeneric.cpp
2 ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
2 ./WiFiClientSecure/src/ssl_client.cpp
1 ./WiFi/src/WiFiServer.cpp
Explicación:
-
grep -RIci NEEDLE .
- busca la cadena NEEDLE de forma recursiva desde el directorio actual (siguiendo los enlaces simbólicos), ignorando los binarios, contando el número de ocurrencias, ignorando el caso -
awk ...
- este comando ignora archivos con cero ocurrencias y formatea líneas -
sort -hr
- ordena las líneas en orden inverso por números en la primera columna
Por supuesto, también funciona con otros comandos grep con la opción -c
(contar). Por ejemplo:
grep -c "tcp" *.txt | awk -v FS=":" -v OFS="/t" ''$2>0 { print $2, $1 }'' | sort -hr
Solución única de Grep que he probado con grep para windows:
grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"
Esta solución contará todas las apariciones incluso si hay múltiples en una línea. -r
busca de forma recursiva en el directorio, -o
"mostrará solo la parte de una línea que coincide con PATRÓN": esto es lo que divide múltiples apariciones en una sola línea y hace que grep imprima cada coincidencia en una nueva línea; luego canalice esos resultados separados por nueva línea en grep con -c
para contar el número de ocurrencias usando el mismo patrón.
Solución AWK obligatoria:
grep -c string * | awk ''BEGIN{FS=":"}{x+=$2}END{print x}''
Tenga cuidado si sus nombres de archivo incluyen ":" sin embargo.
Variante recursiva corta:
find . -type f -exec cat {} + | grep -c ''string''
cat * | grep -c string
cat * | grep -c string
Una de las raras aplicaciones útiles del cat
.
grep -oh string * | wc -w
contará múltiples ocurrencias en una línea