246

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をバッファリングし、特定の行を返す)になることも理解していますが、スクリプトを配置しなくても利用できる標準のシェルコマンドがあるかどうかを知りたいです。

4

12 に答える 12

375

を使用してsed、多様性のために:

ls -l | sed -n 2p

必要な行が印刷されたときに入力の読み取りを停止するため、より効率的に見えるこの代替手段を使用すると、フィード プロセスで SIGPIPE が生成され、不要なエラー メッセージが生成される可能性があります。

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

lsSIGPIPE を取得したときに文句を言うコマンドではありませんが、通常は最初のコマンドを使用するのに十分な頻度で見てきました (とにかく、入力するのは簡単です) 。

行の範囲の場合:

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'
于 2009-09-15T21:06:11.917 に答える
101
ls -l | head -2 | tail -1
于 2009-09-15T20:54:18.840 に答える
22

sed1lineから:

# print line number 52
sed -n '52p'                 # method 1
sed '52!d'                   # method 2
sed '52q;d'                  # method 3, efficient on large files

awk1lineから:

# print line number 52
awk 'NR==52'
awk 'NR==52 {print;exit}'          # more efficient on large files
于 2009-09-24T15:31:54.023 に答える
7

このsedバージョンを試してください:

ls -l | sed '2 ! d'

「2行目以外はすべて削除」と書いてあります。

于 2009-09-15T21:04:45.243 に答える
3

別のポスターが提案されました

ls -l | head -2 | tail -1

しかし、head を tail にパイプすると、N 行目までのすべてが 2 回処理されているように見えます。

尻尾を頭に配管

ls -l | tail -n +2 | head -n1

より効率的でしょうか?

于 2014-06-13T23:07:36.477 に答える
0

うーん

私の場合、sedは機能しませんでした。私が提案する:

「奇数」行の場合 1,3,5,7... ls |awk '0 == (NR+1) % 2'

「偶数」行の場合 2,4,6,8 ls |awk '0 == (NR) % 2'

于 2012-07-20T11:51:29.980 に答える
0

はい、最も効率的な方法 (Jonathan Leffler が既に指摘したように) は、print & quit で sed を使用することです。

set -o pipefail                        # cf. help set
time -p ls -l | sed -n -e '2{p;q;}'    # only print the second line & quit (on Mac OS X)
echo "$?: ${PIPESTATUS[*]}"            # cf. man bash | less -p 'PIPESTATUS'
于 2009-09-16T14:46:46.943 に答える
-1

より完全にするために..

ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)

2 行目に到達するまで行を破棄し、その後に最初の行を印刷します。したがって、3行目を出力します。

2行目だけなら..

ls -l | (read; head -n1)

必要な数の「読み取り」を入れます。

于 2009-09-15T21:50:52.037 に答える