매초마다 한 줄의 데이터를 출력하는 프로세스를 실행하고 있습니다. 모든 출력을 "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>&1
stderr
로 전송된 콘텐츠를 리디렉션합니다stdout
.|
stdout
왼쪽 파이프가stdin
오른쪽 파이프에 연결됩니다.tee output.txt
동시에 두 가지 작업을 수행합니다.stdin
에 쓰기output.txt
stdin
에 전달되었습니다stdout
.
|
stdout
에 파이프를 연결합니다stdin
.grep --line-buffered @
@
from이 포함된 행을 선택하여stdin
으로 보냅니다stdout
.> emails.txt
stdin
에 무엇이든 쓰세요emails.txt
.
이 --line-buffered
플래그는 grep
출력에 라인 버퍼링을 사용하므로 성능이 저하될 수 있지만모두출력은 파일로 인쇄됩니다.
답변2
응답해주신 모든 분들께 감사드립니다. 아래 코드가 작동합니다.
myProgram | pee 'tee -a output.txt' 'grep --line-buffered @ > emails.txt'
- 또한 프로그램이 콘솔에 인쇄되기를 원합니다. "tee"는 이 작업을 수행하고 output.txt를 추가합니다.
- 버퍼링 사용 안 함:명령의 출력을 grep으로 파이프한 다음 다른 명령으로 파이프합니다.