Grep
在文件列表中查找出現併計算它們
我有一大組執行緒轉儲,它們位於目錄樹中(每 30 分鐘一個文件夾)。 我正在嘗試計算單個文件中有多少個執行緒。到目前為止,我想出了:
find . -name 'high-cpu-tdump.out' -exec grep -H "Thread-" {} \;
這返回:
./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] . . . . . .
這是一個好的開始,但是我需要用“wc -l”連結它,以便我知道每個文件有多少執行緒。我正在做一些嘗試,但都失敗了:
find . -name 'high-cpu-tdump.out' -exec grep -H "Thread-" {} | wc -l \; find: missing argument to `-exec'
您是否知道 find 是否可行,或者我是否必須編寫一個腳本來逐個檢查每個單個文件的目錄?
如果不使用ie的顯式 shell 呼叫,您將無法通過管道
wc -l
傳遞到grep
命令-exec``sh -c
find . -name 'high-cpu-tdump.out' -exec sh -c 'grep -H "Thread-" {} | wc -l' ';'
但是執行它不會產生文件名,其中可以找到模式。為了可靠地做到這一點,建議在裡面使用一個 shell 循環
sh -c
來列印文件名和相關的字數find . -name 'high-cpu-tdump.out' -exec sh -c ' for file; do printf "%s %s\n" "file" $(grep -c "Thread-" "$file") ; done' -- {} +
或者
grep
單獨使用而不使用 find,使用--include
允許提供 glob 表達式以在遞歸時僅搜尋那些文件的標誌(GNU/BSD 變體)grep -r -c 'Thread-' --include='high-cpu-tdump.out' .
我建議還使用ripgrep,預設情況下遞歸地對文件進行 greps 並且速度更快(source)。你可以在其中做
rg -c 'Thread-' -g 'high-cpu-tdump.out'