티에서 grep하는 방법?

티에서 grep하는 방법?

명령 출력에 "rerun"(그런 다음 다시 실행)이 포함되어 있는지 확인하고 싶지만 전체 출력도 표시하고 싶습니다. 다음 중 하나를 사용할 수 있다는 것을 알고 있습니다.

command | tee >(grep rerun)
command | grep rerun

첫 번째는 예상대로 전체 출력을 인쇄하지만 항상 0을 반환하기 때문에 조건으로 사용할 수 없습니다. 두 번째는 rerun이 포함된 행만 인쇄하지만 일치하는 항목이 없으면 1을 반환합니다.

내 사용 예:

while pdflatex paper.tex | grep -E "rerun LaTeX|run Biber"; do
    biber paper
done

여기에 제공된 답변grep은 항상 0을 반환하므로 도움이 되지 않습니다.

답변1

그냥 사용

command | tee outfile | grep rerun

또는

while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do

grep 명령의 상태를 확인하고 나중에 "output" 파일을 볼 수 있습니다.

답변2

파일을 보고 해당 파일을 grep할 수 있습니다. 그런 다음 종료 코드를 grep할 수 있습니다(0은 일치를 의미함).

RERUN=1
while [[ $RERUN == 1 ]] ; do
  biber paper
  ! pdflatex paper.tex | tee output.txt && grep -E -q "rerun LaTeX|run Biber" output.txt
  RERUN=$?
done

4행에서는 !grep이 일치 항목을 찾으면 0을 반환하고 일치 항목이 없으면 1을 반환하기 때문에 grep 프로세스의 종료 코드를 반대로 바꿉니다.grep 매뉴얼 페이지:

종료 상태

   Normally the exit status is 0 if a line is selected, 1 if no lines were
   selected, and 2 if an error occurred.  However, if the -q or --quiet or
   --silent is used and a line is selected, the exit status is 0  even  if
   an error occurred.

5행에서는 마지막 종료 코드( $?)를 루프 조건에 사용되는 RERUN 변수에 넣습니다.

또한 -qstdout에 쓰지 않도록 grep에 옵션을 추가했습니다.

답변3

stdout즉각적인 표시를 고집하는 경우 grep프로세스 대체의 출력을 파일로 리디렉션하여 출력에서 ​​중복 행을 방지해야 하므로 다음을 수행해야 합니다 command | tee >(grep rerun >/tmp/my.log).

[[ -s /tmp/my.log ]]파일이 생성되면 이를 재실행 조건으로 사용하기 만 하면 됩니다 .

관련 정보