누가 온라인인지 표시하는 명령을 사용한 who
다음 파이프를 사용하여 처음과 마지막 두 명의 온라인 사용자를 표시해야 합니다. 내가 아는 유일한 방법은 다음과 같습니다.
who | head -5 | tail -2
.
그러나 이것은 작동하지 않습니다.
답변1
곧장:
who | head -2
who | tail -2
답변2
다음으로 사용 tee
하고 리디렉션 할 수 있습니다.stderr
who | tee >(head -n2 1>&2 ) | tail -n2
여기서는 실제로 파일을 명령으로 대체 하고 tee
출력 을 (를 통해 ) 로 리디렉션하며 모든 것이 명령 으로 파이프되어 처리되므로 결과 도 우회 해야 합니다 . 그러나 여전히 터미널에 자체적으로 인쇄됩니다.stdin
stdout
head
stdout
stderr
1>&2
stout
tail
tail
head
stderr
댓글 토론을 기반으로 업데이트됨
Stéphane이 지적했듯이 head
SIGPIPE 신호를 보내 파이프라인을 조기에 종료하여 tail
입력 스트림의 실제 끝이 표시되지 않을 수 있습니다.
이를 방지하기 위해 아래 설명과 같이 SIGPIPE 신호를 무시할 수 있습니다.여기, trap
빈 명령과 함께 a를 사용합니다. 테스트 대상 은 bash
다음과 같습니다...
who | { trap "" PIPE ; tee >( head -n 2 3>&1 >&2 ) ; } | tail -n 2
또한 의견에서도 언급되었습니다. bash
쉘이 아닌 경우 결과 순서가 엉망이 될 수 있습니다. Stéphane이 제안한 솔루션을 참조하세요.
답변3
tail
명령을 사용하려고 하면 오류가 발생합니다. 실제로 who
명령 출력에서 원하는 것을 추출하는 데 사용하는 것이 아니라 head
명령에서 원하는 것을 추출하는 데 사용합니다.
head
파이프를 사용 하고 결합 해야 하는 경우 tail
다음과 같이 할 수 있습니다.
(who |head -n5 && who |tail -n2)
필요에 맞게 번호를 수정하세요.