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 -l
el grep
comando como parte de -exec
sin utilizar una invocación explícita de Shell con sh -c
ie
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 -c
que 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 grep
solo sin buscar, haciendo uso de la --include
bandera (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'