디렉토리 트리(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로 가능한지 아시나요, 아니면 각 파일별로 dir을 확인하는 스크립트를 작성해야 합니까?
답변1
즉, 명시적인 셸 호출을 사용하지 않고는 wc -l
명령 grep
의 일부로 파이프할 수 없습니다 .-exec
sh -c
find . -name 'high-cpu-tdump.out' -exec sh -c 'grep -H "Thread-" {} | wc -l' ';'
하지만 이것을 실행하면~ 아니다패턴이 발견된 파일 이름을 생성합니다. 이를 안정적으로 수행하려면 sh -c
파일 이름 및 관련 단어 수를 인쇄하는 내부 쉘 루프를 사용하는 것이 좋습니다.
find . -name 'high-cpu-tdump.out' -exec sh -c '
for file; do printf "%s %s\n" "file" $(grep -c "Thread-" "$file") ; done' -- {} +
또는 반복 중에 해당 파일만 검색하는 glob 표현식을 제공할 수 있는 플래그(GNU/BSD 변형)를 grep
사용하여 찾기 없이 단독으로 사용할 수 있습니다.--include
grep -r -c 'Thread-' --include='high-cpu-tdump.out' .
나는 또한 사용하는 것이 좋습니다립그렙기본적으로 파일을 재귀적으로 파악하며 훨씬 빠릅니다(원천). 당신이 할 수있는 것
rg -c 'Thread-' -g 'high-cpu-tdump.out'