파일 목록에서 항목을 찾아 개수를 계산합니다.

파일 목록에서 항목을 찾아 개수를 계산합니다.

디렉터리 트리(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

wc -l명령 grep을 파이프라인의 일부로 파이프할 수 있는 방법은 없습니다 .-execsh -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 표현식 제공을 허용하는 플래그를 grep활용하여 찾기 없이 단독으로 사용합니다 (GNU/BSD 변형).--include

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

나는 또한 사용하는 것이 좋습니다립그렙기본적으로 파일을 재귀적으로 수집하며 더 빠릅니다(원천). 넌 그 안에서 할 수 있어

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

관련 정보