Encuentre ocurrencias en una lista de archivos y cuéntelas

Encuentre ocurrencias en una lista de archivos y cuéntelas

Tengo un gran conjunto de volcados de subprocesos que se encuentran en un árbol de directorios (una carpeta por cada 30 minutos).

Estoy intentando contar cuántos subprocesos hay en un solo archivo. Hasta ahora se me ocurrió:

find . -name 'high-cpu-tdump.out' -exec grep -H "Thread-" {} \;

Esto devuelve:

./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-0 (HornetQ-server-HornetQServerImpl::serverUUID=7582b137-83b1-11e9-bc0d-b5863efb47a2-961209098)" #123 prio=5 os_prio=0 tid=0x00007f01a45be000 nid=0x4a4 waiting on condition [0x00007f010b730000]
./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-1 (HornetQ-scheduled-threads-2107959528)" #121 prio=5 os_prio=0 tid=0x00007f01c01ff800 nid=0x4a2 waiting on condition [0x00007f0130897000]
./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-0 (HornetQ-Asynchronous-Persistent-Writes221963927-1847608919)" #120 daemon prio=5 os_prio=0 tid=0x00007f01a4527000 nid=0x49a waiting on condition [0x00007f0131487000]
./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-0 (HornetQ-scheduled-threads-2107959528)" #116 prio=5 os_prio=0 tid=0x00007f01a4377800 nid=0x490 waiting on condition [0x00007f0131ce4000]
. . . . . .

Ese es un buen comienzo, sin embargo, necesito encadenarlo con un 'wc -l' para saber cuántos subprocesos hay para cada archivo. Estoy haciendo algunos intentos, pero todos fallan:

find . -name 'high-cpu-tdump.out' -exec grep -H "Thread-" {} | wc -l \;
find: missing argument to `-exec'

¿Tiene una idea de si es factible con buscar o tengo que escribir un script que verifique directorio por directorio cada archivo?

Respuesta1

No puede canalizar wc -lel grepcomando como parte de -execsin utilizar una invocación explícita de Shell con sh -cie

find  . -name 'high-cpu-tdump.out' -exec sh -c 'grep -H "Thread-" {} | wc -l' ';'

Pero ejecutar esto sínoproducir los nombres de archivos, en los que se encuentran los patrones. Para hacer esto de manera confiable, sugiera usar un bucle de shell interno sh -cque imprima el nombre del archivo y el recuento de palabras asociadas.

find . -name 'high-cpu-tdump.out' -exec sh -c '
    for file; do printf "%s %s\n" "file" $(grep -c "Thread-" "$file") ; done' -- {} +

O úselo grepsolo sin buscar, haciendo uso de la --includebandera (variantes GNU/BSD) que permite proporcionar una expresión global para buscar solo esos archivos mientras se recurre

grep -r -c 'Thread-' --include='high-cpu-tdump.out' .

Yo sugeriría también usarripgrepque busca archivos de forma recursiva de forma predeterminada y es mucho más rápido (fuente). En el que podrías simplemente hacer

rg -c 'Thread-' -g 'high-cpu-tdump.out'

información relacionada