Dari semua perintah Linux di luar sana (dan ada banyak), tiga yang paling klasik tampaknya adalah sed
, awk
, dan grep
. Mungkin itu suara misterius dari nama mereka, atau luasnya potensi penggunaan mereka, atau hanya usia mereka, tetapi ketika seseorang memberikan contoh perintah "Linux", itu biasanya salah satu dari ketiganya. Dan sementara sed
dan grep
memiliki beberapa standar satu baris sederhana, awk
yang kurang bergengsi tetap menonjol karena sangat membingungkan.
Anda cenderung menggunakan sed
untuk penggantian string cepat atau grep
untuk menyaring pola setiap hari. Anda jauh lebih kecil kemungkinannya untuk menulis awk
memerintah. Saya sering bertanya-tanya mengapa ini terjadi, dan saya menghubungkannya dengan beberapa hal. Pertama-tama, banyak dari kita yang jarang menggunakan sed
dan grep
untuk apa pun kecuali beberapa variasi pada dua perintah ini:
$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt
Lebih banyak sumber daya Linux
- Lembar contekan perintah Linux
- Lembar contekan perintah Linux tingkat lanjut
- Kursus online gratis:Ikhtisar Teknis RHEL
- Lembar contekan jaringan Linux
- Lembar contekan SELinux
- Lembar contekan perintah umum Linux
- Apa itu container Linux?
- Artikel Linux terbaru kami
Jadi, meskipun Anda mungkin merasa lebih nyaman dengan sed
dan grep
, Anda mungkin tidak menggunakan potensi penuh mereka. Tentu saja, tidak ada kewajiban untuk mempelajari lebih lanjut tentang sed
atau grep
, tetapi terkadang saya bertanya-tanya tentang cara saya "mempelajari" perintah. Alih-alih mempelajari bagaimana perintah bekerja, saya sering belajar mantra tertentu yang mencakup perintah. Akibatnya, saya sering merasakan keakraban yang salah dengan perintah. Saya rasa saya tahu sebuah perintah karena saya dapat menyebutkan tiga atau empat opsi dari atas kepala saya, meskipun saya tidak tahu apa yang dilakukan opsi tersebut dan tidak dapat menggunakan sintaks.
Dan itulah masalahnya, saya yakin, yang dihadapi banyak orang ketika dihadapkan dengan kekuatan dan fleksibilitas awk
.
Mempelajari awk menggunakan awk
Dasar-dasar awk
sangat sederhana. Sering dicatat bahwa awk
adalah bahasa pemrograman, dan meskipun itu bahasa yang relatif mendasar, itu benar. Ini berarti Anda dapat mempelajari awk
dengan cara yang sama Anda mempelajari bahasa pengkodean baru:pelajari sintaksnya menggunakan beberapa perintah dasar, pelajari kosakatanya sehingga Anda dapat membangun tindakan yang kompleks, lalu berlatih, berlatih, berlatih.
Bagaimana awk mem-parsing input
Awk
melihat input, pada dasarnya, sebagai array. Ketika awk
memindai file teks, ia memperlakukan setiap baris, satu per satu dan berturut-turut, sebagai rekaman . Setiap catatan dipecah menjadi bidang . Tentu saja, awk
harus melacak informasi ini, dan Anda dapat melihat data tersebut menggunakan NR
(jumlah record) dan NF
(jumlah bidang) variabel bawaan. Misalnya, ini memberi Anda jumlah baris file:
$ awk 'END { print NR;}' example.txt
36
Ini juga mengungkapkan sesuatu tentang awk
sintaksis. Apakah Anda sedang menulis awk
sebagai satu baris atau sebagai skrip mandiri, struktur awk
instruksinya adalah:
pattern or keyword { actions }
Dalam contoh ini, kata END
adalah kata kunci khusus yang dicadangkan, bukan pola. Kata kunci yang serupa adalah BEGIN
. Dengan kedua kata kunci ini, awk
cukup jalankan aksi dalam kurung kurawal di awal atau akhir penguraian data.
Anda dapat menggunakan pola sebagai filter atau qualifier agar awk
hanya mengeksekusi tindakan yang diberikan ketika itu dapat mencocokkan pola Anda dengan catatan saat ini. Misalnya, Anda ingin menggunakan awk
, sebanyak yang Anda lakukan grep
, untuk menemukan kata Linux dalam file teks:
$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)
Untuk awk
, setiap baris dalam file adalah catatan, dan setiap kata dalam catatan adalah bidang. Secara default, bidang dipisahkan oleh spasi. Anda dapat mengubahnya dengan --field-separator
opsi, yang menyetel FS
(pemisah bidang) variabel menjadi apa pun yang Anda inginkan:
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
Dalam contoh ini, ada ruang kosong sebelum setiap daftar karena ada ruang kosong setelah setiap titik dua (:
) dalam teks sumber. Ini bukan cut
, jadi pemisah bidang tidak perlu dibatasi pada satu karakter:
$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
Fungsi di awk
Anda dapat membangun fungsi Anda sendiri di awk
menggunakan sintaks ini:
name(parameters) { actions }
Fungsi penting karena memungkinkan Anda untuk menulis kode sekali dan menggunakannya kembali di seluruh pekerjaan Anda. Saat membangun satu baris, fungsi kustom sedikit kurang berguna daripada di skrip, tetapi awk
mendefinisikan banyak fungsi untuk Anda. Mereka bekerja pada dasarnya sama dengan fungsi apa pun dalam bahasa atau spreadsheet lain:Anda mempelajari urutan bahwa fungsi tersebut membutuhkan informasi dari Anda, dan Anda dapat memasukkannya apa pun yang Anda inginkan untuk mendapatkan hasilnya.
Ada fungsi untuk melakukan operasi matematika dan pemrosesan string. Yang matematika seringkali cukup mudah. Anda memberikan nomor, dan nomor itu berbunyi:
$ awk 'BEGIN { print sqrt(1764); }'
42
Fungsi string bisa lebih kompleks tetapi didokumentasikan dengan baik di manual awk GNU. Misalnya, split
fungsi mengambil entitas yang awk
dilihat sebagai satu bidang dan membaginya menjadi beberapa bagian. Ini membutuhkan bidang, variabel untuk digunakan sebagai larik yang berisi setiap bagian dari pemisahan, dan karakter yang ingin Anda gunakan sebagai pembatas.
Menggunakan output dari contoh sebelumnya, saya tahu bahwa ada alamat IP di akhir setiap record. Dalam hal ini, saya hanya dapat mengirim bidang terakhir dari catatan ke split
fungsi dengan mereferensikan variabel NF
karena berisi jumlah bidang (dan bidang terakhir harus angka tertinggi):
$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2
Ada banyak lagi fungsi, dan tidak ada alasan untuk membatasi diri Anda pada satu per blok awk
kode. Anda dapat membuat pipeline yang kompleks dengan awk
di terminal Anda, atau Anda dapat menulis awk
skrip untuk mendefinisikan dan memanfaatkan fungsi Anda sendiri.
Unduh eBuku
Belajar awk
sebagian besar masalah menggunakan awk
. Gunakan bahkan jika itu berarti menduplikasi fungsionalitas yang sudah Anda miliki dengan sed
atau grep
atau cut
atau tr
atau perintah lain yang benar-benar valid. Setelah Anda merasa nyaman dengannya, Anda dapat menulis fungsi Bash yang menjalankan awk
khusus Anda perintah agar lebih mudah digunakan. Dan pada akhirnya, Anda akan dapat menulis skrip untuk mengurai kumpulan data yang kompleks.
Unduh . kami eBuku untuk mempelajari semua yang perlu Anda ketahui tentang awk
, dan mulai gunakan hari ini.