output.log
다음 내용이 포함된 파일이 있습니다 .
Thread started
Thread finished
Thread started
Thread finished
Thread started
Thread started
다음을 사용하여 출력을 모니터링합니다.
tail -f output.log
현재 실행 중인 스레드 수를 기록하는 명령을 작성하고 싶습니다. 위의 경우 출력은 다음과 같습니다.
2 threads are running
grep을 사용하고 어떻게든 문자열 인스턴스를 기록해야 합니까?
답변1
계산에 사용할 수 있습니다 awk
. 그러나 더 복잡한 것이 없다면 다음을 사용할 수 있습니다.
tail -f output.log | awk '/Thread started/{n++}/Thread finished/{n--} END { printf ("%d Threads are running\n", n)}' output.log
더 나은 방법은 watch
다음과 같이 사용하는 것입니다.
watch -n.2 -x awk '/Thread started/{n++}/Thread finished/{n--} END { printf ("%d Threads are running\n", n)}' output.log
화면 상단에 나타나는 모든 항목이 -n.2
새로 고쳐집니다 .0.2s
답변2
다음 bash
스크립트를 시도해 볼 수 있습니다.
#!/bin/bash
start_count=$(grep -c "started" /path/to/output.log)
finish_count=$(grep -c "finished" /path/to/output.log)
echo "$((start_count - finish_count)) threads are running"
이는 인쇄 가능 범위 밖에 있는 이전에 실행 중인 스레드를 모두 고려합니다 tail -f
. 여기서는 파일에서 "시작됨" 및 "완료됨"이 나타나는 횟수를 계산하고 간단히 이 값을 빼서 결과를 얻습니다. tail -30 /path/to/output.log
전체 파일 대신 읽을 줄 범위(예: )를 선택하고 해당 줄을 기준으로 결과를 찾으려는 경우 .
답변3
이 스크립트를 실행해 보세요.
a=$(grep started output.log | wc -l)
b=$(grep finished output.log | wc -l)
echo Total Running threads: "$[$a-$b]"
Bash 스크립트를 생성하고 위의 줄을 붙여넣습니다. 스레드가 실행되게 됩니다.