관련 질문이 있습니다 stdout을 두 방향으로 분기하는 방법 그러나 다른 반전이 있습니다. (티셔츠에 대해서는 이미 알고 있어요! :)
출력을 있는 그대로 표시하고(티에서 콘솔로?) 추가 개선을 위해 파이프로 연결하기를 원합니다.
예: 나는 가지고 있다
ps -ef | grep -i something
이제 양측 모두 이 결과를 확인하고 이를 더욱 개선할 수 있기를 바랍니다.
| awk '{print "epwdx "$2}'
물론 두 명령을 순차적으로 실행하여 모든 결과를 캡처할 수 있지만 때로는 명령을 하나의 단위로 실행하여 일관성 있는 현재 진실을 말할 가능성을 높이고 싶을 때도 있습니다.
아마도 다른 트릭(예: -, 2>, &2 등)을 사용하여 이를 수행하는 방법이 있을 수 있지만 아직 본 적이 없습니다.
답변1
출력을 파이프 중간에서 터미널까지 끌어오려면 ( 또는 ) tee
에 연결 하면 됩니다 ./dev/tty
/dev/stderr
그러면 출력이 something
터미널에 인쇄되고 동일한 출력이 somefilter
출력 파일로 전달됩니다.
somecmd | tee /dev/tty | somefilter > output
그러나 나중에 출력을 보려면 최종 출력과 중간 출력을 모두 파일에 저장한 다음 보는 것이 더 쉬울 수 있습니다.
ps
그러나 표시되는 프로세스 집합 이나 인쇄되는 필드 만 필터링하려는 경우 프로그램에는 몇 가지 기본 제공 옵션도 있습니다 . 보다수동프로세스 선택, 출력 형식 및 형식 지정자의 경우.
답변2
당신이 사용할 수있는pee
당신이 가지고 있다면:
오줌은 티셔츠와 비슷하지만 파이프용입니다. 각 명령은 실행되고 표준 입력의 복사본을 제공합니다. 모든 명령의 출력은 stdout으로 전송됩니다. tee와 비슷하지만 입력 복사본이 tee처럼 stdout으로 전송되지 않습니다.
입력을 STDOUT에 복사하는 명령을 암시적으로 지정해야 하는 것 같습니다.
ps -ef | pee "cat" "grep -i something"
답변3
tee
다음과 같은 프로세스 대체를 사용할 수 있습니다 .
ps -ef | grep -i something | tee >(awk '{print "epwdx "$2}')
@roaima가 좋은 솔루션을 제공했다고 생각하지만 awk
이것이 아마도 가장 좋은 방법일 것입니다.
답변4
내가 아는 한, 파일 설명자만으로는 이 작업을 수행할 수 없으며 제안된 트릭만으로도 tee >/dev/tty
작업을 수행하기에 충분한 것 같습니다.
정보를 공유하기 위해 다음과 같이 bash 구성 파일의 함수를 사용하여 작업을 수행하고 있습니다.
function teee { a="$(</dev/stdin)";echo -e "pipe in\n$a\npipe out\n" >/dev/stderr; echo "$a"; }
시험:
$ cat file11 |teee|grep -Po '[A-Za-z]+[\s|\w]+,\s[0-9]+' file11 | teee |awk '{print $2}'
pipe in
Ubuntu, 120, 143, 154
Yggdrasil, 144, 170-171
Yood, Charles, 6
We Were Young, Bob, 178-179
Zawinski, Jamie, 204
pipe out
pipe in
Ubuntu, 120
Yggdrasil, 144
Charles, 6
Bob, 178
Jamie, 204
pipe out
120
144
6
178
204