1. ホーム
  2. バッシュ

[解決済み】STDOUTのn行目を取得するコマンド

2022-04-03 16:49:44

質問

STDOUTのn行目を取得するbashコマンドはないのでしょうか?

つまり、これを受け取るようなものです。

$ ls -l
-rw-r--r--@ 1 root  wheel my.txt
-rw-r--r--@ 1 root  wheel files.txt
-rw-r--r--@ 1 root  wheel here.txt

というようなことをします。

$ ls -l | magic-command 2
-rw-r--r--@ 1 root  wheel files.txt

再利用を目的としたスクリプトを書くときには、これは悪い習慣であることは理解していますが、シェルで毎日作業するときには、このような方法でSTDOUTをフィルターすることができると便利です。

また、これは半自明なコマンド(STDOUTをバッファリングし、特定の行を返す)であることは分かっていますが、何か 標準 シェルコマンドは、私がスクリプトを作成しなくても利用可能です。

解決方法は?

使用方法 sed を、バラエティ豊かにするためです。

ls -l | sed -n 2p

この方法は、必要な行が表示された時点で入力を読むのを止めるので、より効率的に見えますが、送り出し処理でSIGPIPEを発生させ、その結果不要なエラーメッセージを発生させる可能性があります。

ls -l | sed -n -e '2{p;q}'

よく見かけるので、普段は最初の方(とにかく入力しやすい方)を使っていますが ls はSIGPIPEを取得しても文句を言うようなコマンドではありません。

行の範囲の場合。

ls -l | sed -n 2,4p

複数の範囲の行に対応。

ls -l | sed -n -e 2,4p -e 20,30p
ls -l | sed -n -e '2,4p;20,30p'