Dapatkan baris pertama dari keluaran perintah shell

96

Saat mencoba membaca nomor versi vim, saya mendapatkan banyak baris tambahan yang perlu saya abaikan. Saya mencoba membaca manual headdan mencoba perintah berikut:

vim --version | head -n 1

Saya ingin tahu apakah ini pendekatan yang benar?

john doe
sumber
4
Bagaimana bisa gagal? Ini bekerja untuk saya.
choroba
1
Sintaksnya benar. Apa kesalahannya ..?
Kaushik Nayak
1
Itu berfungsi untuk saya, tetapi mungkin Anda menggunakan versi vim yang menulis info versi ke stderr. Cobavim --version 2>&1 | sed 1q
William Pursell
Berfungsi untuk saya juga - jadi ya, pendekatan Anda benar :)Periksa apakah paket Anda mengeluarkan info itu stderrsebagai @WilliamPursell menyediakan pemeriksaan.
David C. Rankin

Jawaban:

133

Ya, itu adalah salah satu cara untuk mendapatkan baris pertama keluaran dari sebuah perintah.

Jika perintah mengeluarkan sesuatu ke kesalahan standar yang ingin Anda tangkap dengan cara yang sama, Anda perlu mengarahkan kesalahan standar perintah ke aliran keluaran standar:

utility 2>&1 | head -n 1

Ada banyak cara lain untuk menangkap baris pertama juga, termasuk sed 1q(berhenti setelah baris pertama), sed -n 1p(hanya mencetak baris pertama, tetapi membaca semuanya), awk 'FNR == 1'(hanya mencetak baris pertama, tetapi sekali lagi, membaca semuanya) dll.

Kusalananda
sumber
4

Saya akan menggunakan:

awk 'FNR <= 1' file_*.txt

Seperti yang ditunjukkan @Kusalananda, ada banyak cara untuk menangkap baris pertama dalam baris perintah tetapi menggunakan opsi ini head -n 1mungkin bukan pilihan terbaik saat menggunakan karakter pengganti karena ini akan mencetak info tambahan. Mengubah 'FNR == i'ke 'FNR <= i'memungkinkan untuk mendapatkan baris i pertama.

Misalnya, jika Anda memiliki n file bernama file_1.txt, ... file_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

Tetapi dengan headwildcard mencetak nama file:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye
alemol
sumber
1
Lihathead -qn1 file_*.txt
F. Hauri