이전 프로그램의 출력 라인 수


32

특정 프로그램이 생성하는 출력 줄 수를 세려고합니다. 문제는 프로그램을 실행하는 데 시간이 오래 걸리고 출력을 사용자에게 표시하고 싶습니다. 마지막 명령이 출력 한 줄 수를 계산하는 방법이 있습니까?

할 수는 program | wc -l있지만 출력은 사용자에게 표시되지 않습니다. 내가 아는 한,해야합니다. program; program | wc -l하지만 프로그램을 실행하는 데 최소 1 분이 걸리므로 맨 아래에 줄 수를 표시하기 위해 두 번 이상 수행하지 않아도됩니다.

편집하다:

  • 출력이 발생할 때마다 (라인별로) 표시 한 다음 끝에 카운트를 반환하는 방법이 있습니까?

방법 : 프로그램이 자체 출력을 추적하도록하고 프로그램 STDOUT_WRITE_COUNT끝에서 변수 (예 :)에서 해당 값을 읽 거나 파일 / API에 기록하십시오. WDYT?
mecampbellsoup

답변:


43

tee하나의 사본을 wc다른 사본을 STDOUT으로 보내는 출력 스트림을 정상과 같이 분할하는 데 사용할 수 있습니다 .

program | tee >(wc -l)

>(cmd)수단은 실행 떠들썩한 파티 구문 cmd및 교체 >(cmd)(접속 명명 파이프) 해당 프로그램의 STDIN 경로로 비트.


2
>(cmd)있다 ksh또한 인식 구문 zshbash만 사용하는 명명 된 파이프를 하지 않는 시스템 /dev/fd/n.
Stéphane Chazelas

@StephaneChazelas 예, 대부분의 쉘이 지원하지만 POSIX에는 없으므로 어디서나 사용할 수는 없습니다.
Patrick

그렇습니다. 프로세스 대체가 bash발명 이 아니라는 점을 지적했습니다 .
Stéphane Chazelas

1
@TheLibbster 효율적인 정의 방법에 따라 다릅니다. 이 방법은 2 개 개의 추가 과정, 산란 포함 않습니다 sedawk하나를됩니다. 그러나 tee그리고 wc모두 매우 작습니다 ( sed및 보다 작음 awk).
Patrick

1
@TheLibbster 예, 방금 수행 한 간단한 테스트에 따르면 실제로는 sedand awk메소드 보다 두 배 빠릅니다 . ( 파일에 dd100MB를 /dev/urandom기록한 다음 각 방법을 통해 해당 파일을 여러 번 실행했습니다)
Patrick

10

한 가지 옵션은 awk를 사용하는 것입니다. awk를 사용하면 계산을 수행하고 stdout으로 인쇄 할 수 있습니다.

program | awk '{ print } END { print NR }'

에서 awk, NR은 현재 행 번호입니다. 당신은 펄로 같은 것을 달성 할 수 있습니다 :

program | perl -pe 'END {print "$.\n"}'

또는 sed:

program | sed -n 'p;$='

출력이 발생할 때마다 (라인별로) 표시 한 다음 끝에 카운트를 반환하는 방법이 있습니까?
Libbux

6

stderr에서 stdout을 복제 할 수 있습니다.

program | tee /dev/stderr | wc -l

그렇게하면 programstdout이 teestderr에 기록되도록 파이프되어 콘솔에 인쇄됩니다. tee또한 파이프 된 데이터를 stdout (파이프 된)에 기록합니다 wc.


3

내가 가장 좋아하는 옵션 :

program | grep "" -c

1
OP는 다른 것을 요구했을 수도 있지만, 나는 단지 많은 수의 라인 출력을 얻기 위해 찾고 왔으며 실제 출력을 표시하는 것에 신경 쓰지 않았습니다. 감사!
Nikhil VJ

0
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)

0

늦었을 수 있습니다. 그러나 변수에서 계산 된 숫자를 잡는 방법에 대한 후속 질문을 다루겠습니다.

이것이 당신이 원하는 것 YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)입니다.

tee여기서는 두 개의 스트림 을 생성 하는 이점을 활용하여 하나 /dev/stderr는 화면에 표시되고 다른 하나 wc -l는 라인 수를보고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.