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 -l
an den Befehl weiterleiten , ohne einen expliziten Shell-Aufruf mit ie zu verwenden.grep
-exec
sh -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 -c
die 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 grep
allein ohne „find“, wobei Sie das Flag (GNU/BSD-Varianten) verwenden, --include
das 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'