パイプを使用してシステムの最初の2人のユーザーと最後の2人のユーザーをリストしますか?

パイプを使用してシステムの最初の2人のユーザーと最後の2人のユーザーをリストしますか?

誰がオンラインであるかを示す whoコマンドを使用し、パイプを使用して最初と最後の2人のオンラインユーザーを表示する必要があります。私が知っている唯一の方法は次のとおりです。

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)

必要に応じて番号を編集してください。

関連情報