stdout으로 출력하고 동시에 파일로 grep


18

에 텍스트를 출력하는 스크립트가 stdout있습니다. 터미널 에서이 모든 출력을보고 싶으며 동시에 일부 줄을 필터링하고 파일에 저장하려고합니다. 예:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

터미널에서 첫 번째 명령의 출력을보고 두 번째 명령의 출력을 파일에 저장하고 싶습니다. 동시에. 나는 사용하여 시도 tee,하지만 결과,이나와 더 나은와 반대의 결과 .

답변:


27

터미널에서 첫 번째 명령의 출력을보고 두 번째 명령의 출력을 파일에 저장하고 싶습니다.

보고있는 내용이 stdout 또는 stderr 에서 오는 것이 중요하지 않은 한 여전히 다음을 사용할 수 있습니다 tee.

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

리눅스에서 작동합니다; "/ dev / stderr"이 다른 * nix에 똑같이 적용되는지 모르겠습니다.


9
/dev/stderr일반적이다. /dev/tty(현재 터미널을 의미)도 여기에서 작동하며 표준 입니다.
Gilles 'SO- 악의를 멈춰라'

@Gilles : 훌륭합니다. 터미널에 스크립트 tee /dev/tty를 인쇄하고 다른 명령에 stdout스크립트를 파이프해야한다는 요구에 훌륭하게 봉사했습니다 stdin! 감사합니다! :-)
jamadagni 2018 년

8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

또는 프로세스 대체 (ksh93, zsh 또는 bash) :

... | tee >(grep -e A -e C > out.file)

zsh로 :

... >&1 > >(grep -e A -e C > out.file)

grep의 종료 코드를 유지하기 때문에 첫 번째를 사용해야한다는 것을 알았습니다. 또한 어떤 이유로 / dev 파일 시스템에 액세스 할 수없는 경우 다음과 같이 /dev/fd/3바꿀 수 있습니다.>(cat 1>&3)
golvok

4

다른 방법은 sed다음 과 같습니다.

myscript | sed '/PATTERN/w out.file'

기본적으로 sed모든 행을 인쇄 하므로이 경우 stdoutstdin 과 동일합니다 (예 : myscript화면 의 전체 출력이 표시됨).
또한, 모든 행은 일치 PATTERN한다 w으로 리튼out.file


-1

tee 명령 사용 방법을 지정하지 않았지만 작동해야합니다.

myscript | grep -P 'A|C' | tee out.file

적어도 몇 분 전에 서버에서 작동했습니다 ...


4
내가 잘못 아니에요하지만,이 방법 을 grep은 또한 화면에거야. 화면의 모든 출력 을보고 파일에 들어가는 내용 만 필터링 하고 싶습니다 .
lorenzo-s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.