GNU/Linux >> Belajar Linux >  >> Linux

Tingkatkan keterampilan awk Anda dengan dua tutorial mudah

Awk adalah salah satu alat tertua di kotak alat pengguna Unix dan Linux. Dibuat pada tahun 1970-an oleh Alfred Aho, Peter Weinberger, dan Brian Kernighan (A, W, dan K dari nama alat tersebut), awk dibuat untuk pemrosesan aliran teks yang kompleks. Ini adalah alat pendamping untuk sed, editor aliran, yang dirancang untuk pemrosesan file teks baris demi baris. Awk memungkinkan program terstruktur yang lebih kompleks dan merupakan bahasa pemrograman yang lengkap.

Artikel ini akan menjelaskan cara menggunakan awk untuk tugas yang lebih terstruktur dan kompleks, termasuk aplikasi gabungan surat sederhana.

Struktur program awk

Skrip awk terdiri dari blok fungsional yang dikelilingi oleh {} (kurung keriting). Ada dua blok fungsi khusus, BEGIN dan AKHIR , yang dieksekusi sebelum memproses baris pertama dari aliran input dan setelah baris terakhir diproses. Di antaranya, blok memiliki format:

pattern { action statements } 

Setiap blok dieksekusi ketika baris dalam buffer input cocok dengan polanya. Jika tidak ada pola yang disertakan, blok fungsi akan dieksekusi pada setiap baris aliran input.

Juga, sintaks berikut dapat digunakan untuk mendefinisikan fungsi dalam awk yang dapat dipanggil dari blok mana pun:

function name(parameter list) { statements } 

Kombinasi blok dan fungsi pencocokan pola ini memungkinkan pengembang menyusun program awk untuk digunakan kembali dan mudah dibaca.

Bagaimana awk memproses aliran teks

Awk membaca teks dari file inputnya atau streaming satu baris pada satu waktu dan menggunakan pemisah bidang untuk menguraikannya menjadi beberapa bidang. Dalam terminologi awk, buffer saat ini adalah record . Ada sejumlah variabel khusus yang memengaruhi cara awk membaca dan memproses file:

  • FS (pemisah bidang):Secara default, ini adalah spasi (spasi atau tab) apa pun
  • RS (pemisah rekaman):Secara default, baris baru (\n )
  • NF (jumlah bidang):Saat awk mem-parsing sebuah baris, variabel ini disetel ke jumlah bidang yang telah diuraikan
  • $0: Rekor saat ini
  • $1, $2, $3, dll.: Bidang pertama, kedua, ketiga, dll. dari catatan saat ini
  • NR (jumlah catatan):Jumlah catatan yang telah diuraikan sejauh ini oleh skrip awk

Ada banyak variabel lain yang memengaruhi perilaku awk, tetapi ini sudah cukup untuk memulai.

Awk satu kalimat

Untuk alat yang sangat kuat, menarik bahwa sebagian besar penggunaan awk adalah satu baris dasar. Mungkin program awk yang paling umum mencetak bidang yang dipilih dari baris input dari file CSV, file log, dll. Misalnya, satu baris berikut mencetak daftar nama pengguna dari /etc/passwd :

awk -F":" '{print $1 }' /etc/passwd 

Seperti disebutkan di atas, $1 adalah bidang pertama dalam catatan saat ini. -F opsi menyetel variabel FS ke karakter : .

Pemisah bidang juga dapat diatur dalam blok fungsi BEGIN:

awk 'BEGIN { FS=":" } {print $1 }' /etc/passwd 

Dalam contoh berikut, setiap pengguna yang shell-nya bukan /sbin/nologin dapat dicetak dengan mendahului blok dengan pola yang cocok:

awk 'BEGIN { FS=":" } ! /\/sbin\/nologin/ {print $1 }' /etc/passwd 

Awk lanjutan:Gabungan surat

Sekarang setelah Anda memiliki beberapa dasar-dasarnya, cobalah mempelajari lebih dalam tentang awk dengan contoh yang lebih terstruktur:membuat gabungan surat.

Gabungan surat menggunakan dua file, satu (disebut dalam contoh ini email_template.txt ) yang berisi template untuk email yang ingin Anda kirim:

Dari:Panitia program 
Kepada:{firstname} {lastname} <{email}>
Subject:Proposal presentasi Anda

Dear { firstname},

Terima kasih atas proposal presentasi Anda:
  {title}

Dengan senang hati kami informasikan bahwa proposal Anda telah berhasil! Kami
akan segera menghubungi Anda untuk informasi lebih lanjut tentang
jadwal acara.

Terima kasih,
Panitia Program

Dan yang lainnya adalah file CSV (disebut proposals.csv ) dengan orang yang ingin Anda kirimi email:

nama depan,nama belakang,email,judul
Harry,Potter,[email protected],"Mengalahkan musuh bebuyutanmu dalam 3 langkah mudah"
Jack, Reacher,[email protected],"Tangan- pertarungan tangan kosong untuk pemula"
Mickey,Mouse,[email protected],"Bertahan berbicara di depan umum dengan suara melengking"
Santa,Claus,[email protected],"Pembuatan daftar yang efisien"

Anda ingin membaca file CSV, ganti bidang yang relevan di file pertama (melewati baris pertama), lalu tulis hasilnya ke file bernama acceptanceN.txt , menambah N untuk setiap baris yang Anda urai.

Tulis program awk dalam file bernama mail_merge.awk . Pernyataan dipisahkan oleh ; dalam skrip awk. Tugas pertama adalah mengatur variabel pemisah bidang dan beberapa variabel lain yang dibutuhkan skrip. Anda juga perlu membaca dan membuang baris pertama di CSV, atau file akan dibuat dimulai dengan Dear firstname . Untuk melakukan ini, gunakan fungsi khusus getline dan setel ulang penghitung rekaman ke 0 setelah membacanya.

BEGIN {
  FS=",";
  template="email_template.txt";
  output="acceptance";
  getline;
  NR=0;
}

Fungsi utamanya sangat mudah:untuk setiap baris yang diproses, variabel ditetapkan untuk berbagai bidang—nama depan , nama belakang , email , dan judul . File template dibaca baris demi baris, dan fungsinya sub digunakan untuk menggantikan setiap kemunculan urutan karakter khusus dengan nilai variabel yang relevan. Kemudian baris, dengan substitusi apa pun yang dibuat, adalah output ke file output.

Karena Anda berurusan dengan file template dan file output yang berbeda untuk setiap baris, Anda perlu membersihkan dan menutup pegangan file untuk file-file ini sebelum memproses catatan berikutnya.

{
        # Baca bidang yang relevan dari file masukan
        namadepan=$1;
        nama belakang=$2;
        email=$3;
        title=$4;

        # Setel nama file keluaran
        outfile=(output NR ".txt");

        # Membaca baris dari template, mengganti bidang khusus, dan
        # mencetak result to output file
        while ( (getline ln 0 )
        {
                sub(/{firstname}/,firstname,ln);
                sub(/{ }/,nama belakang,ln);
                sub(/{email}/,email,ln);
                sub(/{title}/,title,ln);
                print(ln)> outfile;
        }

        # Tutup file template dan output sebelum record berikutnya
        close(outfile);
        close(template);
}

Kamu sudah selesai! Jalankan skrip pada baris perintah dengan:

awk -f mail_merge.awk proposals.csv 

atau

awk -f mail_merge.awk < proposals.csv 

dan Anda akan menemukan file teks yang dihasilkan di direktori saat ini.

Awk lanjutan:Jumlah frekuensi kata

Salah satu fitur yang paling kuat di awk adalah array asosiatif. Dalam kebanyakan bahasa pemrograman, entri array biasanya diindeks oleh angka, tetapi dalam awk, array direferensikan oleh string kunci. Anda dapat menyimpan entri dari file proposals.txt dari bagian sebelumnya. Misalnya, dalam array asosiatif tunggal, seperti ini:

        pengusul["nama depan"]=$1;
        pengusul["nama belakang"]=$2;
        pengusul["email"]=$3;
        pengusul["title"]=$4;

Ini membuat pemrosesan teks menjadi sangat mudah. Program sederhana yang menggunakan konsep ini adalah gagasan penghitung frekuensi kata. Anda dapat mengurai file, memecah kata (mengabaikan tanda baca) di setiap baris, menambah penghitung untuk setiap kata di baris, lalu menampilkan 20 kata teratas yang muncul di teks.

Pertama, dalam file bernama wordcount.awk , setel pemisah bidang ke ekspresi reguler yang menyertakan spasi putih dan tanda baca:

BEGIN {
        # abaikan 1 atau lebih kemunculan karakter yang berurutan
        # dalam grup karakter di bawah
        FS="[ .,:;()<>{}@!\ "'\t]+";
}

Selanjutnya, fungsi loop utama akan mengulangi setiap bidang, mengabaikan bidang kosong apa pun (yang terjadi jika ada tanda baca di akhir baris), dan menambah jumlah kata untuk kata di baris.

{
        for (i =1; i <=NF; i++) {
                if ($i !="") {
                      kata[$i]++;
                }
        }
}

Terakhir, setelah teks diproses, gunakan fungsi END untuk mencetak isi array, kemudian gunakan kemampuan awk untuk menyalurkan output ke perintah shell untuk melakukan pengurutan numerik dan mencetak 20 kata yang paling sering muncul:

END {
        sort_head ="sort -k2 -nr | head -n 20";
        for (word in words) {
                printf "%s\t%d\n" , kata, kata[kata] | sort_head;
        }
        close (sort_head);
}

Menjalankan skrip ini pada draf awal artikel ini menghasilkan keluaran ini:

[[email protected]]$ awk -f wordcount.awk yang     79
awk     41
a       39
dan     33
dari      32
di      27
sampai      26
adalah      25
baris    23
untuk     23
akan    22
mengajukan 21
kami      16
Kami      15
dengan    12
yang   12
oleh      12
ini    11
menghasilkan  11
fungsi        11

Apa selanjutnya?

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

Jika Anda ingin mempelajari lebih lanjut tentang pemrograman awk, saya sangat merekomendasikan buku Sed and awk oleh Dale Dougherty dan Arnold Robbins.

Salah satu kunci untuk maju dalam pemrograman awk adalah menguasai "ekspresi reguler yang diperluas." Awk menawarkan beberapa tambahan yang kuat untuk sintaks ekspresi reguler sed yang mungkin sudah Anda kenal.

Sumber lain yang bagus untuk mempelajari awk adalah panduan pengguna awk GNU. Ini memiliki referensi lengkap untuk pustaka fungsi bawaan awk, serta banyak contoh skrip awk sederhana dan kompleks.


Linux
  1. Cadangkan file Anda dengan rsync

  2. Cocokkan dua string dalam satu baris dengan grep

  3. Bagaimana cara menyinkronkan dua folder dengan alat baris perintah?

  1. Rekam sesi terminal Anda dengan Asciinema

  2. Amankan wadah Anda dengan SELinux

  3. Pindai keamanan Linux Anda dengan Lynis

  1. Memecahkan masalah jaringan Anda dengan tcpdump

  2. 13 latihan untuk meningkatkan keterampilan Linux Anda

  3. Linux – Bagaimana Menyinkronkan Dua Folder Dengan Alat Baris Perintah?