Suchen Sie nach Vorkommen in einer Liste von Dateien und zählen Sie sie

Suchen Sie nach Vorkommen in einer Liste von Dateien und zählen Sie sie

Ich habe einen großen Satz von Thread-Dumps, die sich in einem Verzeichnisbaum befinden (jeweils ein Ordner für 30 Minuten).

Ich versuche zu zählen, wie viele Threads sich in einer einzelnen Datei befinden. Bisher ist mir Folgendes eingefallen:

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

Dies gibt zurück:

./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]
. . . . . .

Das ist ein guter Anfang, ich muss es jedoch mit einem „wc -l“ verketten, damit ich für jede Datei weiß, wie viele Threads vorhanden sind. Ich unternehme einige Versuche, aber alle schlagen fehl:

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

Haben Sie eine Idee, ob das mit „find“ machbar ist, oder muss ich ein Skript schreiben, das Verzeichnis für Verzeichnis jede einzelne Datei überprüft?

Antwort1

Sie können nicht als Teil von wc -lan den Befehl weiterleiten , ohne einen expliziten Shell-Aufruf mit ie zu verwenden.grep-execsh -c

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

Aber das Ausführen diesernichterzeugen die Dateinamen, in denen die Muster gefunden werden. Um dies zuverlässig zu tun, schlagen wir vor, eine Shell-Schleife darin zu verwenden, sh -cdie den Dateinamen und die zugehörige Wortanzahl ausgibt

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

Oder verwenden Sie es grepallein ohne „find“, wobei Sie das Flag (GNU/BSD-Varianten) verwenden, --includedas es ermöglicht, einen Glob-Ausdruck bereitzustellen, um nur die Dateien zu durchsuchen, während rekursiv

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

Ich würde auch vorschlagen,Abonnierenwelches standardmäßig rekursiv nach Dateien sucht und viel schneller ist (Quelle). In dem Sie einfach

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

verwandte Informationen