尋找文件清單中的出現次數並對其進行計數

尋找文件清單中的出現次數並對其進行計數

我有一大堆線程轉儲,它們位於目錄樹中(每 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 一起使用,還是我必須編寫一個腳本來逐一檢查每個文件的目錄?

答案1

如果不使用ie 的顯式 shell 調用,則無法透過管道wc -lgrep命令作為 的一部分-execsh -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預設情況下,它以遞歸方式 grep 查找文件,並且速度更快(來源)。你可以在其中做

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

相關內容