Saat menulis skrip Bash, Anda terkadang menemukan diri Anda dalam situasi di mana Anda perlu membaca file baris demi baris. Misalnya, Anda mungkin memiliki file teks yang berisi data yang harus diproses oleh skrip.
Dalam tutorial ini, kita akan membahas cara membaca file baris demi baris di Bash.
Membaca File Baris demi Baris Sintaks #
Sintaks paling umum untuk membaca file baris demi baris adalah sebagai berikut:
while IFS= read -r line; do
printf '%s\n' "$line"
done < input_file
atau versi satu baris yang setara:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
Bagaimana cara kerjanya?
File masukan (input_file
) adalah nama file yang dialihkan ke loop while. read
perintah memproses file baris demi baris, menetapkan setiap baris ke line
variabel. Setelah semua baris diproses, loop while akan berhenti.
Secara default, tombol read
command menginterpretasikan garis miring terbalik sebagai karakter pelarian dan menghapus semua spasi putih awal dan akhir, yang terkadang dapat menyebabkan perilaku yang tidak diharapkan. Untuk menonaktifkan pelolosan garis miring terbalik, kami menjalankan perintah dengan -r
opsi, dan untuk menonaktifkan pemangkasan, pemisah bidang internal (IFS
) dihapus.
Kami menggunakan [printf
] bukannya echo
untuk membuat kode lebih portabel dan untuk menghindari perilaku yang tidak diinginkan. Misalnya, jika baris berisi nilai seperti “-e”, baris tersebut akan diperlakukan sebagai opsi gema.
Membaca File Baris demi Baris Contoh #
Mari kita lihat contoh berikut. Misalkan kita memiliki file bernama distros.txt
berisi daftar beberapa distribusi Linux paling populer, dan manajer paketnya dipisahkan dengan koma (,
):
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
Untuk membaca file baris demi baris, Anda akan menjalankan kode berikut di terminal Anda:
while IFS= read -r line; do
printf '%s\n' "$line"
done < distros.txt
Kode membaca file per baris, menetapkan setiap baris ke variabel, dan mencetaknya. Pada dasarnya, Anda akan melihat output yang sama seperti jika Anda menampilkan konten file menggunakan cat
perintah.
Bagaimana jika Anda ingin mencetak hanya distribusi yang menggunakan apt? Salah satu caranya adalah dengan menggunakan if
pernyataandan periksa apakah baris berisi substring apt:
while IFS= read -r line; do
if [[ "$line" == *"apt"* ]]; then
printf '%s\n' "$line"
fi
done < distros.txt
Ubuntu,apt
Debian,apt
Saat membaca file baris demi baris, Anda juga dapat meneruskan lebih dari satu variabel ke read
perintah, yang akan membagi baris menjadi beberapa bidang berdasarkan IFS
. Bidang pertama ditugaskan ke variabel pertama, yang kedua ke variabel kedua, dan seterusnya. Jika ada lebih banyak bidang daripada variabel, bidang yang tersisa ditetapkan ke variabel terakhir.
Dalam contoh berikut, kami menetapkan IFS
ke koma (,
) dan berikan dua variabel distro
dan pm
ke read
memerintah. Semuanya dari awal baris hingga koma pertama akan ditetapkan ke variabel pertama (distro
), dan sisa baris akan ditetapkan ke variabel kedua (pm
):
while IFS=, read -r distro pm; do
printf '%s is the package manager for %s\n' "$pm" "$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
Metode Membaca File Alternatif #
Menggunakan Substitusi Proses #
Substitusi proses adalah fitur yang memungkinkan Anda menggunakan output dari perintah sebagai file:
while IFS= read -r line; do
printf '%s\n' "$line"
done < <(cat input_file )
Menggunakan String Di Sini #
Here String adalah varian dari dokumen Here. String (cat input_file )
menyimpan baris baru:
while IFS= read -r line; do
printf '%s\n' "$line"
done <<< $(cat input_file )
Menggunakan deskriptor File #
Anda juga dapat memberikan input ke loop menggunakan deskriptor file:
while IFS= read -r -u9 line; do
printf '%s\n' "$line"
done 9< input_file
Saat bekerja dengan deskriptor file, gunakan angka antara 4 dan 9 untuk menghindari konflik dengan deskriptor file internal shell.
Kesimpulan #
Di Bash, kita dapat membaca file baris demi baris menggunakan loop while dan read
perintah.
Jika Anda memiliki pertanyaan atau masukan, jangan ragu untuk memberikan komentar.