GNU/Linux >> Belajar Linux >  >> Linux

Panduan praktis untuk belajar awk

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.


Linux
  1. Panduan pemula untuk firewalld di Linux

  2. Panduan pemula untuk melongo

  3. 8 perintah Linux praktis favorit saya

  1. Panduan untuk menginstal aplikasi di Linux

  2. Belajar mencintai systemd

  3. Panduan pemula untuk izin Linux

  1. Perintah AWK di Linux dengan Contoh

  2. Perintah Linux - Panduan Lengkap

  3. Perintah Awk di Linux