Android

Bagaimana membaca baris fail mengikut baris dalam bash

Linux Command Line (07) Viewing Files (cat, more, less, head, tail)

Linux Command Line (07) Viewing Files (cat, more, less, head, tail)

Isi kandungan:

Anonim

Apabila menulis skrip Bash, anda kadang-kadang akan mendapati diri anda dalam situasi di mana anda perlu membaca garis fail mengikut baris. Sebagai contoh, anda mungkin mempunyai fail teks yang mengandungi data yang perlu diproses oleh skrip.

Dalam tutorial ini, kami akan membincangkan cara membaca garis fail mengikut baris dalam Bash.

Membaca Talian Fail Dengan Sintaks Aliran

Sintaks yang paling umum untuk membaca fail baris demi baris adalah seperti berikut:

while IFS= read -r line do echo "$line" done < input_file

atau versi satu talian bersamaan:

while IFS= read -r line; do echo $line; done < input_file

Bagaimanakah ia berfungsi?

Fail input ( input_file ) adalah nama fail yang anda hendak buka untuk membaca oleh perintah read . Perintah read membaca baris fail mengikut baris, menyerahkan setiap baris kepada pemboleh ubah line . Setelah semua baris diproses, gelung sementara akan ditamatkan. Pemisah medan dalaman ( IFS ) ditetapkan kepada rentetan null untuk memelihara ruang kosong utama dan trailing yang merupakan kelakuan lalai bagi arahan read .

Membaca Talian Fail Mengikut Contoh Talian

Mari kita lihat contoh berikut. Katakan, kami mempunyai fail bernama distros.txt mengandungi senarai beberapa pengedaran Linux yang paling popular dan pengurus pakejnya dipisahkan dengan koma ( , ):

distros.txt

Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf

Untuk membaca baris fail mengikut baris, anda akan menjalankan kod berikut dalam terminal anda:

while IFS= read -r line do echo "$line" done < distros.txt

Kod akan membaca fail mengikut baris, menetapkan setiap baris kepada pembolehubah, dan echo pembolehubah. Keaslian anda akan melihat output yang sama seolah-olah anda akan memaparkan kandungan fail menggunakan perintah kucing.

Bagaimana jika anda mahu mencetak hanya pengagihan yang menggunakan apt? Salah satu cara ialah menggunakan pernyataan jika dan periksa sama ada garisan mengandungi substring yang sesuai:

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

Apabila membaca baris fail demi baris, anda juga boleh lulus lebih daripada satu pembolehubah kepada arahan baca yang akan memisahkan baris ke dalam bidang berdasarkan IFS . Bidang pertama ditugaskan kepada pemboleh ubah pertama, pembolehubah kedua untuk kedua, dan sebagainya. Sekiranya terdapat lebih banyak medan daripada pemboleh ubah, medan yang tertinggal diberikan kepada pemboleh ubah terakhir.

Dalam contoh berikut, kami menetapkan IFS kepada koma ( , ) dan lulus dua pemboleh ubah distro dan pm kepada arahan baca. Segala-galanya dari permulaan garisan sehingga koma pertama akan ditugaskan kepada pembolehubah pertama ( distro ) dan sisanya baris akan diberikan kepada pemboleh ubah kedua ( pm ):

while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt

apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora

Kaedah Membaca Fail Alternatif

Menggunakan Pergantian Proses

Penggantian proses membolehkan anda lulus output daripada perintah sebagai nama fail:

while IFS= read -r line do echo "$line" done < <(cat input_file)

Menggunakan String Di Sini

Di sini String adalah varian Di sini dokumen. Rentetan (cat input_file) akan menyimpan baris baru:

while IFS= read -r line do echo "$line" done <<< $(cat input_file)

Menggunakan deskriptor Fail

Anda juga boleh memberikan input ke gelung menggunakan deskriptor fail:

while IFS= read -r -u9 line do echo "$line" done 9< input_file

Apabila bekerja dengan deskriptor fail menggunakan nombor antara 4 dan 9 untuk mengelakkan konflik dengan deskriptor fail dalaman shell.

Kesimpulannya

Di Bash, kita dapat membaca fail demi baris fail dengan menyediakan nama fail sebagai input untuk sementara membaca gelung.

terminal bash