특정 프로그램이 생성하는 출력 줄 수를 계산하려고합니다. 문제는 프로그램입니다. 실행하는 데 시간이 오래 걸리고 사용자에게 출력을 표시하고 싶습니다. 마지막 명령이 출력 한 줄 수를 계산하는 방법이 있습니까?
program | wc -l
를 수행 할 수는 있지만 사용자에게 출력을 표시하지 않습니다. 내가 아는 한 program; program | wc -l
를 수행해야합니다. 그러나 프로그램을 실행하는 데 최소 1 분이 걸리기 때문에 한 번 이상 수행 할 필요가 없습니다. 하단에 줄 수를 표시합니다.
수정 :
- 출력을 한 줄씩 표시 한 다음 마지막에 개수를 반환하는 방법이 있습니까?
코멘트
답변
tee
를 사용하여 하나의 사본을 wc
로 보내는 출력 스트림을 분할 할 수 있습니다. 다른 사본은 평소처럼 STDOUT에 복사합니다.
program | tee >(wc -l)
>(cmd)
는 ru를 의미하는 bash 구문입니다. n cmd
를 입력하고 >(cmd)
비트를 해당 프로그램의 STDIN에 대한 경로 (연결된 명명 된 파이프)로 바꿉니다.
댓글
-
>(cmd)
는ksh
구문입니다. id = “5ae6a5d5c1″>
및 bash
이며 '이 (가)없는 시스템에서 명명 된 파이프 만 사용하고 있습니다. div>에 /dev/fd/n
가 없습니다.
sed
및 awk
가 하나 인 2 개의 추가 프로세스 생성이 포함됩니다. 그러나 tee
및 wc
는 모두 매우 작습니다 (sed
및 awk
). sed
및 awk
메서드로 사용됩니다. (dd
100MB의 /dev/urandom
를 파일에 저장 한 다음 각 방법을 통해 해당 파일을 여러 번 실행했습니다.) 답변
한 가지 옵션은 계산을 수행하고 stdout에 인쇄 할 수있는 awk를 사용하는 것입니다.
program | awk "{ print } END { print NR }"
awk
에서 NR은 현재 줄 번호입니다. perl을 사용하여 동일한 작업을 수행 할 수 있습니다.
program | perl -pe "END {print "$.\n"}"
또는 sed
:
program | sed -n "p;$="
코멘트
- 출력을 한 줄씩 표시 한 다음 마지막에 카운트를 반환하는 방법이 있습니까? ?
답변
내가 가장 좋아하는 옵션 :
program | grep "" -c
댓글
- OP에서 다른 질문을했을 수 있지만 출력 된 줄 수를 확인하기 위해 여기에 왔습니다. ' 실제 출력을 표시하는 데는 신경 쓰지 않습니다. 감사합니다!
답변
stderr에서 stdout을 복제 할 수 있습니다.
program | tee /dev/stderr | wc -l
그러면 program
“의 stdout이 tee
로 파이프되어 stderr에 기록됩니다. 콘솔에 인쇄됩니다. tee
는 파이프 된 데이터를 해당 stdout에 씁니다. 이는 wc
로 파이프됩니다.
답변
늦을 수 있습니다.하지만 변수에서 계산 된 숫자를 잡는 방법에 대한 후속 질문을 처리하겠습니다.
이것이 YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
원하는 것입니다.
여기서 두 개의 스트림을 생성하는 tee
를 활용하고 하나는 화면에 나타나는 /dev/stderr
로, 다른 하나는 줄 수를보고하는 wc -l
로 보냅니다.
답변
tail -f /var/log/squid/access.log | ( c=0; pl() { echo $c; c=0; }; trap pl SIGHUP; while read a; do (( c=c+1 )); done ) & ( trap "kill $! ; exit" SIGINT; trap "" SIGHUP; while true; do kill -HUP $! ; sleep 1; done)
STDOUT_WRITE_COUNT
) 또는 프로그램 종료시 파일 / API에 기록하십시오. WDYT?