이전 프로그램의 출력 줄 수 세기

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

program | wc -l를 수행 할 수는 있지만 사용자에게 출력을 표시하지 않습니다. 내가 아는 한 program; program | wc -l를 수행해야합니다. 그러나 프로그램을 실행하는 데 최소 1 분이 걸리기 때문에 한 번 이상 수행 할 필요가 없습니다. 하단에 줄 수를 표시합니다.

수정 :

  • 출력을 한 줄씩 표시 한 다음 마지막에 개수를 반환하는 방법이 있습니까?

코멘트

  • 어떻게 : 프로그램이 자체 출력을 추적하고 변수에서 해당 값을 읽도록합니다 (예 : STDOUT_WRITE_COUNT) 또는 프로그램 종료시 파일 / API에 기록하십시오. WDYT?

답변

tee를 사용하여 하나의 사본을 wc로 보내는 출력 스트림을 분할 할 수 있습니다. 다른 사본은 평소처럼 STDOUT에 복사합니다.

program | tee >(wc -l) 

>(cmd)는 ru를 의미하는 bash 구문입니다. n cmd를 입력하고 >(cmd) 비트를 해당 프로그램의 STDIN에 대한 경로 (연결된 명명 된 파이프)로 바꿉니다.

댓글

  • >(cmd)ksh 구문입니다. id = “5ae6a5d5c1″>

bash이며 ' 명명 된 파이프 만 사용하고 있습니다. div>에 /dev/fd/n가 없습니다.

  • @StephaneChazelas 예, 대부분의 셸이 지원하지만 ' POSIX이므로 ' 어디서나 신뢰할 수 없습니다.
  • 예, 프로세스 대체가 귀하의 답변에있는 표현으로 발명은 믿을 수 있습니다.
  • @TheLibbster 효율적으로 정의하는 방법에 따라 다릅니다. 이 방법에는 sedawk가 하나 인 2 개의 추가 프로세스 생성이 포함됩니다. 그러나 teewc는 모두 매우 작습니다 (sedawk).
  • @TheLibbster 예, 방금 수행 한 몇 가지 간단한 테스트에 따르면 ' 실제로 약 2 배 빠릅니다. sedawk 메서드로 사용됩니다. (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) 

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다