grep을 사용하여 출력을 다른 파일로 필터링하는 동안 출력을 한 파일로 리디렉션

grep을 사용하여 출력을 다른 파일로 필터링하는 동안 출력을 한 파일로 리디렉션

매초마다 한 줄의 데이터를 출력하는 프로세스를 실행하고 있습니다. 모든 출력을 "output.txt"로 출력하고 싶지만 @가 있는 줄도 다른 파일 "emails.txt"로 출력하고 싶습니다. 아래와 같이 시도했지만 grep 부분이 작동하지 않습니다.

myProgrram | pee 'tee output.raw 2>&1' 'grep @ > email.txt'

이를 개선하는 방법에 대한 아이디어가 있습니까? 감사해요.

답변1

해결책은 다음과 같습니다.

myprogram 2>&1 | tee output.txt | grep --line-buffered @ > emails.txt

설명하다:

  • stdin"표준 입력"(파일 설명자 번호 0)입니다.
  • stdout"표준 출력"(파일 설명자 번호 1)입니다.
  • stderr"표준 오류"(파일 설명자 번호 2)입니다.
  • 2>&1stderr로 전송된 콘텐츠를 리디렉션합니다 stdout.
  • |stdout왼쪽 파이프가 stdin오른쪽 파이프에 연결됩니다.
  • tee output.txt동시에 두 가지 작업을 수행합니다.
    • stdin에 쓰기output.txt
    • stdin에 전달되었습니다 stdout.
  • |stdout에 파이프를 연결합니다 stdin.
  • grep --line-buffered @@from이 포함된 행을 선택하여 stdin으로 보냅니다 stdout.
  • > emails.txtstdin에 무엇이든 쓰세요 emails.txt.

--line-buffered플래그는 grep출력에 라인 버퍼링을 사용하므로 성능이 저하될 수 있지만모두출력은 파일로 인쇄됩니다.

답변2

응답해주신 모든 분들께 감사드립니다. 아래 코드가 작동합니다.

myProgram | pee 'tee -a output.txt' 'grep  --line-buffered @ > emails.txt'

관련 정보