명령에 의해 출력되는 라인 수를 실시간으로 표시하는 방법은 무엇입니까?

명령에 의해 출력되는 라인 수를 실시간으로 표시하는 방법은 무엇입니까?

내 응용 프로그램에 대한 패키저 스크립트의 일부로 사용하고 있는데 svn export다른 많은 명령과 마찬가지로 이 명령에도 진행률 표시줄이 없는 것 같습니다.

지금은 두 가지 선택이 있습니다.

  • 옵션 없이 사용하고 수천 줄을 인쇄하는 것을 지켜보세요
  • 를 사용 --quiet하고 완료될 때까지 아무것도 표시되지 않습니다.

명령으로 출력되는 줄 수를 실시간으로 표시하는 방법이 있습니까? 와 같은:

Exporting SVN directory ... 1234 files

그리고 이 숫자를 보세요1234 실시간으로 증가? 이 작업을 수행하는 명령으로 출력을 파이프하는 것을 상상할 수 있지만 어떤 명령입니까?

답변1

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

또는 괄호로 묶인 섹션을 쉘 스크립트에 넣으십시오. 이는 쉘이 실제로 bash, ksh93 또는 zsh와 같은 사전 증가 연산자를 지원하는 경우에만 작동합니다. 그렇지 않으면 $I에서와 같이 증가시킨 다음 인쇄 해야 합니다 I=$((I+1));printf.... 또한 printf쉘에 내장되어 있지 않은 경우(현재 bash에 내장되어 있음) 더 나은 성능을 위해 대신 사용할 수 echo -ne있습니다 print -n. 개행 문자를 억제하고 \r을 이스케이프 문자로 해석하고 싶을 뿐입니다.

답변2

이것은 대략적인 아이디어이지만 pv명령을 사용하여 줄이 지나갈 때 줄 수를 세고 이를 화면에 표시할 수 있습니다. pv많은 스위치 중에는 -l각 라인이 통과하는 횟수를 계산하는 스위치가 있습니다.

여기서는 SVN 출력의 일부 파일을 시뮬레이션하기 위해 while 루프를 사용하고 있습니다.

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

다음과 같이 출력 줄을 계속 덮어씁니다.

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

답변3

백그라운드에서 명령을 작업으로 실행하고 해당 stdout(및 선택적으로 stderr)을 로그 파일로 리디렉션할 수 있습니다. command > logfile &여기서는 &작업을 지정합니다(stderr도 경우 &>대신에 이라고 함 >).

그런 다음 wordcount 유틸리티를 사용하여 wc -l.

동적으로 변경되는 한 줄에서 상태 변경을 표시하려면 다음과 같은 것을 사용할 수 있지만 bash가 이전 줄의 내용을 없애기 위해 캐리지 리턴을 while true; do echo -en '\r'; wc -l logfile; sleep 1; done그리도록 강제할 수는 없습니다 .\r

이 질문을 참조하세요. 거의 중복됩니다.https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

관련 정보