シェルコマンドの出力の最初の行を取得します


96

のバージョン番号を読み取ろうとするとvim、無視する必要のある追加の行がたくさん表示されます。のマニュアルを読んでhead、次のコマンドを試しました。

vim --version | head -n 1

これが正しいアプローチかどうか知りたいですか?


4
どのように失敗しましたか?わたしにはできる。
choroba 2017

1
構文は正しいです。エラーは何ですか。
Kaushik Nayak 2017

2
それは私にとってはうまくいきますが、おそらくあなたはバージョン情報をstderrに書き込むバージョンのvimを使用しています。試してみてくださいvim --version 2>&1 | sed 1q
William Pursell 2017

私にとってもうまくいきます-そうです、あなたのアプローチは正しいです@WilliamPursellがチェックを提供する:)ので、パッケージがその情報を出力するかどうかをstderrチェックしてください。
デビッドC.ランキン

回答:


138

はい、それはコマンドから出力の最初の行を取得する1つの方法です。

コマンドが同じ方法でキャプチャしたい標準エラーに何かを出力する場合は、コマンドの標準エラーを標準出力ストリームにリダイレクトする必要があります。

utility 2>&1 | head -n 1

最初の行をキャプチャする方法は他にもたくさんあります。たとえばsed 1qsed -n 1p(最初の行の後で終了する)、(最初の行だけを印刷するが、すべてを読み取る)、awk 'FNR == 1'(最初の行だけを印刷するが、すべてを読む)などです。


4

私は使うだろう:

awk 'FNR <= 1' file_*.txt

@Kusalanandaが指摘しているように、コマンドラインの最初の行をキャプチャする方法はたくさんありますhead -n 1が、ワイルドカードを使用すると追加情報が出力されるため、を使用するのは最適なオプションではない場合があります。変更する'FNR == i'には、'FNR <= i'最初のi行を取得することができます。

たとえば、file_1.txtという名前のファイルがn個ある場合、... file_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

ただし、headワイルドカードを使用すると、ファイルの名前が出力されます。

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye

1
参照してくださいhead -qn1 file_*.txt
F. HAURI
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.