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?
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?
Jawaban:
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.
awkkode khas untuk tugas tersebut biasanya ls -l | awk 'NR==122,NR==129'.
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 .
sedmetode ini, karenasedjauh lebih kecil (dan memuat lebih cepat) daripadaawk.