Apakah ada perintah bash yang memungkinkan Anda mendapatkan baris ke-10 dari STDOUT?
Artinya, sesuatu yang akan mengambil ini
$ 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
dan melakukan sesuatu seperti
$ ls -l | magic-command 2
-rw-r--r--@ 1 root wheel files.txt
Saya menyadari ini akan menjadi praktik yang buruk ketika menulis skrip yang dimaksudkan untuk digunakan kembali, TETAPI ketika bekerja dengan shell setiap hari itu akan berguna bagi saya untuk dapat menyaring STDOUT saya sedemikian rupa.
Saya juga menyadari ini akan menjadi perintah semi-sepele untuk menulis (buffer STDOUT, mengembalikan baris tertentu), tetapi saya ingin tahu apakah ada beberapa perintah shell standar untuk melakukan ini yang akan tersedia tanpa saya meletakkan skrip pada tempatnya.
magic-command
Jawaban:
Menggunakan
sed
, hanya untuk variasi:Menggunakan alternatif ini, yang terlihat lebih efisien karena berhenti membaca input ketika baris yang diperlukan dicetak, dapat menghasilkan SIGPIPE dalam proses pengumpanan, yang pada gilirannya dapat menghasilkan pesan kesalahan yang tidak diinginkan:
Saya telah melihat bahwa cukup sering bahwa saya biasanya menggunakan yang pertama (yang lebih mudah untuk mengetik, toh), meskipun
ls
bukan perintah yang mengeluh ketika mendapat SIGPIPE.Untuk rentang garis:
Untuk beberapa rentang garis:
sumber
p
adalahsed
pernyataan yang mencetak garis yang diidentifikasi oleh rentang garis yang mendahuluinya. Dengan demikian2,4p
berarti mencetak baris 2, 3, 4.n
berarti TIDAK mencetak semua baris lainnyasumber
head -n 2 | tail -n 1
- kepala dan ekor modern cenderung mengeluarkan peringatan sebaliknya.head -n M | tail -n M-N+1
), dan generalisasi untuk menangani beberapa rentang tidak dimungkinkan.$ ls -l | awk '{if (NR>=4 && NR<=64) print}'
(dapat menambahkan lebih banyak kondisi lebih mudah, beberapa rentang, dll ...)Alternatif cara kepala / ekor yang bagus:
atau
sumber
'2p'
?2
suatu variabel? Setiap contoh menggunakan tanda kutip tunggal, tetapi dengan var Anda perlu tanda kutip ganda. Bisakah kita "memprogram" awk untuk bekerja juga dengan tanda kutip tunggal ketika menggunakan vars? Contohline =1; ls | awk 'NR==$line'
. Saya tahu itubash
menggunakan tanda kutip ganda dengan vars.Dari sed1line :
Dari awk1line :
sumber
Demi kelengkapan ;-)
kode yang lebih pendek
hidup yang lebih pendek
sumber
ls
- pertanyaan asli adalah tentang seseorangSTDOUT
, jadi saya pikir lebih baik untuk membuatnya lebih besar.{ print $0 }
, jadi `awk 'NR == 3' adalah cara yang lebih pendek untuk menulis yang sama.Coba
sed
versi ini :Dikatakan "hapus semua baris yang bukan yang kedua".
sumber
Anda dapat menggunakan awk:
Memperbarui
Kode di atas tidak akan mendapatkan apa yang kita inginkan karena kesalahan satu per satu: baris pertama perintah ls-l adalah baris total . Untuk itu, kode revisi berikut akan berfungsi:
sumber
Apakah Perl mudah tersedia untuk Anda?
Jelas mengganti nomor apa pun yang Anda inginkan untuk 7.
sumber
$ awk 'NR % 7' filename
untuk mencetak setiap baris ke-7 dalam file.Poster lain menyarankan
tetapi jika Anda kepala pipa menjadi ekor, sepertinya semuanya hingga garis N diproses dua kali.
Pipa ekor ke kepala
akan lebih efisien?
sumber
Ya, cara paling efisien (seperti yang telah ditunjukkan oleh Jonathan Leffler) adalah menggunakan sed dengan print & berhenti:
sumber
Hmm
sed tidak bekerja dalam kasus saya. Saya melamar:
sumber
Untuk kelengkapan lebih lanjut ..
Buang garis sampai Anda mendapatkan yang kedua, lalu cetak baris pertama setelah itu. Jadi, ia mencetak baris ke-3.
Jika itu hanya baris kedua ..
Letakkan sebanyak mungkin bacaan yang diperlukan.
sumber
Saya menambahkan ini di .bash_profile saya
Dan itu berhasil
sumber