Mengolah teks Linux dengan grep, sort, uniq, cut, dan wc

Gunakan grep untuk memilih baris yang cocok, sort untuk mengurutkan baris, uniq untuk menggabungkan duplikat yang bersebelahan, cut untuk mengambil bidang dengan pemisah tertentu, dan wc untuk menghitung baris, kata, atau byte. Perintah ini biasanya mengirim hasil ke keluaran standar tanpa menyunting berkas masukan. Dengan urutan yang tepat, Anda dapat menyusunnya menjadi proses pengolahan teks sederhana.

Cara shell menghubungkan tahap dalam pipeline dijelaskan dalam panduan variabel shell dan alur eksekusi berbahasa Inggris. Di sini, bandingkan data yang diketahui dengan hasil pencarian dan hitungannya.

Membuat data kecil untuk latihan

Latihan memakai Bash dan alat GNU sebagai pengguna biasa. Jika ~/linux-course-12-practice sudah ada, pilih nama lain dan sesuaikan jalur. Berhenti jika mkdir atau cd gagal. Jangan membuat berkas sebelum pwd memastikan lokasi latihan baru dan kosong, karena operator > menimpa berkas tujuan yang sudah ada.

mkdir ~/linux-course-12-practice
cd ~/linux-course-12-practice
pwd

Setelah memeriksa posisi, buat lima rekaman. Tiap baris memuat nama dan status yang dipisahkan titik dua:

printf 'alpha:ready\nbeta:waiting\nalpha:done\ngamma:ready\nbeta:ready\n' > records.txt
cat records.txt

cat menampilkan kelima baris yang ditulis. Semua contoh berikut memakai records.txt yang sama, bukan berkas kerja Anda yang lain.

Memilih baris yang cocok dengan grep

grep menampilkan baris yang cocok dengan pola. Opsi -n menambahkan nomor baris pada berkas masukan.

grep -n 'ready' records.txt

Tiga baris cocok. Status waiting tidak memuat ready, sehingga tidak terpilih:

1:alpha:ready
4:gamma:ready
5:beta:ready

Pola bawaan grep adalah ekspresi reguler, yaitu pola dengan karakter tertentu yang mempunyai arti pencocokan khusus. Gunakan grep -F bila menginginkan string tetap secara harfiah. Pada GNU grep, status keluar biasanya 0 jika ada baris terpilih, 1 jika tidak ada kecocokan, dan 2 jika terjadi galat. Keluaran kosong saja belum cukup untuk membedakan kedua keadaan terakhir. Opsi -q mempunyai pengecualian pelaporan galat; contoh ini tidak memakainya.

Mengambil bidang dengan cut dan menghitung dengan wc

cut -d: -f1 memakai titik dua sebagai pemisah dan mengambil bidang pertama dari setiap rekaman, sehingga hanya nama yang tersisa:

cut -d: -f1 records.txt
alpha
beta
alpha
gamma
beta

cut menangani pemisah sederhana, bukan aturan bidang bertanda kutip atau baris baru tertanam seperti parser CSV lengkap. CSV berarti comma-separated values, yaitu format nilai yang dipisahkan koma; format rekaman contoh ini memakai titik dua. Untuk berkas dengan aturan kutip kompleks, pilih parser sesuai formatnya.

wc -l records.txt menampilkan angka 5 diikuti nama berkas:

wc -l records.txt

Lebih tepatnya, wc -l menghitung karakter baris baru. Bagian terakhir berkas tanpa baris baru penutup tidak ikut dihitung sebagai satu baris tambahan. Data latihan mempunyai baris baru pada setiap rekaman, sehingga lima rekaman menghasilkan lima.

wc -w menghitung kata dan wc -c menghitung byte. Karakter multibyte, misalnya karakter Korea, dapat menempati lebih dari satu byte. GNU wc -m menghitung karakter menurut locale yang aktif; hasil bergantung pada pengodean dan pengaturan bahasa tersebut.

Menghubungkan sort dan uniq dengan urutan yang benar

sort mengurutkan baris. uniq hanya menggabungkan baris identik yang bersebelahan. Untuk menghitung nama sama yang terpisah dalam masukan, urutkan dahulu. Tanda pipa | meneruskan keluaran standar perintah kiri menjadi masukan standar perintah kanan.

cut -d: -f1 records.txt | sort | uniq -c

Hasilnya adalah alpha dua kali, beta dua kali, dan gamma satu kali. Spasi di depan angka dan urutan pengurutan dapat berbeda menurut locale serta implementasi:

      2 alpha
      2 beta
      1 gamma

Jika sort dan uniq diterapkan pada seluruh rekaman, alpha:ready dan alpha:done tetap berbeda. Tentukan dulu apa yang dianggap duplikat, lalu ambil bidang yang diperlukan. Locale adalah pengaturan bahasa dan aturan perbandingan karakter; periksa pengaturan ini saat hasil urutan berbeda antarlingkungan.

Memilih alat dan membandingkan satu perubahan

Tujuan Alat Syarat penting
Baris yang cocok grep Bedakan ekspresi reguler dan pola harfiah
Urutan baris sort Periksa locale dan kunci pengurutan
Mengelompokkan duplikat atau menghitung frekuensi uniq Nilai sama harus bersebelahan
Bidang dengan pemisah sederhana cut Tentukan pemisah dan nomor bidang
Jumlah baris, kata, atau byte wc Pilih opsi sesuai hal yang dihitung

Jika hasil kosong atau berbeda dari perkiraan, periksa masukan dengan cat records.txt terlebih dahulu. Jalankan pipeline panjang per tahap untuk mengetahui apakah pola, pemisah, atau pengurutan mengubah hasil. Perhatikan juga pesan galat dan status keluar, bukan hanya keluaran yang terlihat.

Ubah satu hal: tambahkan satu rekaman beta pada data latihan asli yang berisi lima baris. Operator >> menambahkan isi di akhir. Hitungan beta berubah dari 2 menjadi 3 dan jumlah baris menjadi 6. Setelah itu, perintah printf kedua menulis ulang data latihan asli dengan >, lalu hitungan diperiksa kembali.

printf 'beta:ready\n' >> records.txt
cut -d: -f1 records.txt | sort | uniq -c
wc -l records.txt
printf 'alpha:ready\nbeta:waiting\nalpha:done\ngamma:ready\nbeta:ready\n' > records.txt
cut -d: -f1 records.txt | sort | uniq -c
wc -l records.txt

Setelah pemulihan, hasil harus kembali menjadi alpha 2, beta 2, gamma 1, dan total lima baris. Penimpaan ini hanya untuk records.txt latihan yang dibuat di atas. Jangan menerapkannya pada berkas lain atau data yang ingin Anda simpan. Menampilkan hasil pipeline tidak menimpa masukan, tetapi menambahkan pengalihan ke berkas masukan yang sama dapat menghapus data sebelum pemrosesan dimulai.

Dokumentasi resmi

Manual GNU grep menjelaskan pola dan status keluar. Manual GNU Coreutils membahas sort, uniq, cut, dan wc.