파이프를 사용하여 시스템의 처음 두 사용자와 마지막 두 사용자를 나열하시겠습니까?

파이프를 사용하여 시스템의 처음 두 사용자와 마지막 두 사용자를 나열하시겠습니까?

누가 온라인인지 표시하는 명령을 사용한 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출력 을 (를 통해 ) 로 리디렉션하며 모든 것이 명령 으로 파이프되어 처리되므로 결과 도 우회 해야 합니다 . 그러나 여전히 터미널에 자체적으로 인쇄됩니다.stdinstdoutheadstdoutstderr1>&2stouttailtailheadstderr


댓글 토론을 기반으로 업데이트됨

Stéphane이 지적했듯이 headSIGPIPE 신호를 보내 파이프라인을 조기에 종료하여 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)

필요에 맞게 번호를 수정하세요.

관련 정보