Bagaimana menjalankan awk untuk beberapa baris.?

18

Saya ingin mengekstrak beberapa baris dengan awk. Apakah mungkin melakukan tugas berikut:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

Bagaimana saya bisa menampilkan detail dari nomor baris 122 hingga 129?

cooldharma06
sumber
Jika Anda melakukan ini dalam satu lingkaran, saya akan menyarankan sedmetode ini, karena sedjauh lebih kecil (dan memuat lebih cepat) daripada awk.
zrajm

Jawaban:

36

Anda belum mengerti cara awkkerjanya. "Program" yang ditentukan selalu dijalankan satu kali untuk setiap baris (atau "catatan" dalam bahasa awk) dari input, tidak perlu FORatau konstruk yang serupa. Cukup gunakan:

metode verbose

ls -l | awk 'NR>=122 && NR<=129 { print }'

metode yang lebih kompak

ls -l | awk 'NR==122,NR==129'

Seseorang memberi rentang untuk NR, yang merupakan "Nomor Rekaman", biasanya ini adalah baris saat ini awksedang diproses.

zrajm
sumber
6
Sebenarnya awkkode khas untuk tugas tersebut biasanya ls -l | awk 'NR==122,NR==129'.
manatwork
apa perintah untuk mendapatkan 100 baris terakhir dari file menggunakan awk
Shihabudheen KM
8

Satu lagi metode alternatif adalah menggunakan sed:

ls -l | sed -ne '122,129p'

Tetapi jika, seperti pertanyaan Anda menyarankan, penting untuk menggunakan awk untuk ini, ikuti komentar manatwork pada jawaban Zrajm. Seperti yang dinyatakan oleh dokumentasi awk:

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.

Jadi jika Anda mau, Anda juga bisa membuat kondisi yang lebih maju. Sebagai contoh:

ls -l | awk 'NR==122,/foobar/'

Ini akan mulai menghasilkan pada baris 122, dan berlanjut sampai baris berisi kata "foobar".

Jika Anda memberi tahu kami kasus penggunaan yang sebenarnya , kami mungkin dapat membantu dengan jawaban yang memberikan solusi yang lebih baik. Saya khawatir ini terdengar seperti masalah XY .

ghoti
sumber
2

Cara lain untuk melakukan ini (walaupun saya lebih suka awkmetode ini) menggunakan coreutils:

ls -l | tail -n +122 | head -n 8
terdon
sumber