GNU/Linux >> Belajar Linux >  >> Linux

Panduan pemula untuk melongo

gawk adalah implementasi GNU dari bahasa pemrograman Awk, pertama kali dikembangkan untuk sistem operasi UNIX pada 1970-an. Bahasa pemrograman Awk mengkhususkan diri dalam menangani pemformatan data dalam file teks, khususnya data teks yang diatur dalam kolom.

Dengan menggunakan bahasa pemrograman Awk, Anda dapat memanipulasi atau mengekstrak data, membuat laporan, mencocokkan pola, melakukan perhitungan, dan banyak lagi, dengan sangat fleksibel. Awk memungkinkan Anda menyelesaikan tugas yang agak sulit dengan satu baris kode. Untuk mencapai hasil yang sama menggunakan bahasa pemrograman tradisional seperti C atau Python akan membutuhkan upaya tambahan dan banyak baris kode.

gawk juga mengacu pada utilitas baris perintah yang tersedia secara default dengan sebagian besar distribusi Linux. Sebagian besar distribusi juga menyediakan tautan simbolis untuk awk menunjuk ke gawk . Untuk mempermudah, mulai sekarang, kita akan merujuk ke utilitas hanya sebagai awk .

awk memproses data langsung dari input standar - STDIN. Pola umum adalah menyalurkan output program lain ke awk untuk mengekstrak dan mencetak data, tetapi awk  juga dapat memproses data dari file.

Dalam artikel ini, Anda akan menggunakan awk untuk menganalisis data dari file dengan kolom yang dipisahkan spasi. Mari kita mulai dengan meninjau data sampel.

Contoh data

Untuk contoh dalam panduan ini, mari gunakan output dari perintah ps ux disimpan dalam file psux.out . Berikut contoh data dalam file:

$ head psux.out
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ricardo     1446  0.0  0.2  21644 11536 ?        Ss   Sep10   0:00 /usr/lib/systemd/systemd --user
ricardo     1448  0.0  0.1  49212  5848 ?        S    Sep10   0:00 (sd-pam)
ricardo     1459  0.0  0.1 447560  7148 ?        Sl   Sep10   0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
ricardo     1467  0.0  0.1 369144  6080 tty2     Ssl+ Sep10   0:00 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session
ricardo     1469  0.0  0.1 277692  4112 ?        Ss   Sep10   0:00 /usr/bin/dbus-broker-launch --scope user
ricardo     1471  0.0  0.1   6836  4408 ?        S    Sep10   0:00 dbus-broker --log 4 --controller 11 --machine-id 16355057c7274843823dd747f8e2978b --max-bytes 100000000000000 --max-fds 25000000000000 --max-matches 5000000000
ricardo     1474  0.0  0.3 467744 14132 tty2     Sl+  Sep10   0:00 /usr/libexec/gnome-session-binary
ricardo     1531  0.0  0.1 297456  4280 ?        Ssl  Sep10   0:00 /usr/libexec/gnome-session-ctl --monitor
ricardo     1532  0.0  0.3 1230908 12920 ?       S<sl Sep10   0:01 /usr/bin/pulseaudio --daemonize=no

Anda dapat mengunduh file lengkap dari sini, menggunakan perintah ini:

$ curl -o psux.out https://gitlab.com/-/snippets/2013935/raw\?inline\=false

Jika Anda memutuskan untuk menggunakan keluaran ps ux di sistem Anda, sesuaikan nilai yang ditunjukkan pada contoh agar sesuai dengan hasil Anda.

Selanjutnya, mari kita gunakan awk untuk melihat data dari file sampel.

Penggunaan dasar

awk dasar program terdiri dari pola yang diikuti oleh tindakan yang diapit kurung kurawal. Anda dapat memberikan program ke awk utilitas sebaris dengan melampirkannya dalam tanda kutip tunggal, seperti ini:

$ awk 'pattern { action }'

awk memproses data input—input atau file standar—baris demi baris, menjalankan tindakan yang diberikan untuk setiap baris—atau rekaman—yang cocok dengan polanya. Jika pola dihilangkan, awk mengeksekusi tindakan pada semua catatan. Suatu tindakan dapat sesederhana mencetak data dari baris atau serumit program lengkap. Misalnya, untuk mencetak semua baris dari file contoh, gunakan perintah ini:

$ awk '{ print }' psux.out
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ricardo     1446  0.0  0.2  21644 11536 ?        Ss   Sep10   0:00 /usr/lib/systemd/systemd --user
.... OUTPUT TRUNCATED ....

Meskipun contoh ini tidak terlalu berguna, ini menggambarkan awk penggunaan dasar perintah.

Jika Anda menggunakan perintah ps ux  di mesin Anda, Anda dapat menyalurkan outputnya langsung ke awk , alih-alih memberikan nama file input:

$ ps ux | awk '{ print }'

Selanjutnya, mari kita gunakan awk kemampuan pemrosesan kolom untuk mengekstrak sebagian data dari file sampel.

Bidang pencetakan

Kekuatan awk mulai menjadi jelas ketika Anda menggunakan fitur pemrosesan kolomnya. awk secara otomatis membagi setiap baris—atau rekaman—ke dalam bidang. Secara default, ini menggunakan spasi karakter untuk memisahkan setiap bidang, tetapi Anda dapat mengubahnya dengan memberikan parameter baris perintah -F diikuti oleh pemisah yang diinginkan.

Setelah membelah, awk menetapkan setiap bidang ke variabel bernomor, dimulai dengan karakter $ . Misalnya, bidang pertama adalah $1 , $2 yang kedua , dan seterusnya. Variabel khusus $0 berisi seluruh record sebelum dipisah.

Dengan menggunakan variabel bidang, Anda dapat mengekstrak data dari input. Misalnya, untuk mencetak hanya nama perintah dari file sampel, gunakan variabel $11 karena nama perintahnya adalah kolom kesebelas di setiap baris:

$ awk '{ print $11 }' psux.out
COMMAND
/usr/lib/systemd/systemd
(sd-pam)
/usr/bin/gnome-keyring-daemon
.... OUTPUT TRUNCATED ....

Anda juga dapat mencetak beberapa bidang dengan memisahkannya dengan koma. Misalnya, untuk mencetak nama perintah dan penggunaan CPU pada kolom tiga, gunakan perintah ini:

$ awk '{ print $11, $3 }' psux.out
COMMAND %CPU
/usr/lib/systemd/systemd 0.0
(sd-pam) 0.0
/usr/bin/gnome-keyring-daemon 0.0
.... OUTPUT TRUNCATED ....

Terakhir, gunakan printf bawaan berfungsi untuk memformat output dan menyelaraskan kolom. Berikan bantalan 40 karakter di sebelah kanan kolom pertama untuk mengakomodasi nama perintah yang lebih panjang:

$ awk '{ printf("%-40s %s\n", $11, $3) }' psux.out
COMMAND                                  %CPU
/usr/lib/systemd/systemd                 0.0
(sd-pam)                                 0.0
/usr/bin/gnome-keyring-daemon            0.0
/usr/libexec/gdm-wayland-session         0.0
.... OUTPUT TRUNCATED ....

Sekarang Anda dapat memanipulasi dan mengekstrak bidang individual dari setiap record, mari kita terapkan fitur pola untuk memfilter record.

[ Anda mungkin juga menyukai: Memanipulasi teks pada baris perintah dengan sed ]

Pencocokan pola

Selain memanipulasi bidang, awk memungkinkan Anda untuk memfilter rekaman mana yang akan menjalankan tindakan melalui fitur pencocokan pola yang kuat. Dalam penggunaan paling dasar, berikan ekspresi reguler yang diapit oleh garis miring / karakter untuk mencocokkan catatan. Misalnya, untuk memfilter menurut catatan yang cocok dengan firefox , gunakan /firefox/ :

$ awk '/firefox/ { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0

Anda juga dapat menggunakan bidang dan ekspresi perbandingan sebagai kriteria pencocokan pola. Misalnya, untuk mencetak data dari proses yang cocok dengan PID 6685, bandingkan bidang $2 , seperti ini:

$ awk '$2==6685 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 0.0

awk cukup pintar untuk memahami bidang numerik, memungkinkan Anda menggunakan perbandingan relatif seperti lebih besar atau lebih kecil dari. Misalnya, untuk menampilkan semua proses yang menggunakan lebih dari 5% CPU , gunakan $3 > 5 :

$ awk '$3 > 5 { print $11, $3 }' psux.out
/usr/bin/gnome-shell 5.1
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0

Anda dapat menggabungkan pola dengan operator. Misalnya, untuk menampilkan semua proses yang cocok dengan firefox dan gunakan lebih dari 5% CPU , gabungkan kedua pola dengan && operator untuk logika AND :

$ awk '/firefox/ && $3 > 5 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0

Terakhir, karena Anda menggunakan pencocokan pola, awk tidak lagi mencetak baris header. Anda dapat menambahkan baris header Anda sendiri dengan menggunakan BEGIN pola untuk mengeksekusi satu tindakan sebelum memproses catatan apa pun:

$ awk 'BEGIN { printf("%-26s %s\n", "Command", "CPU%")} $3 > 10 { print $11, $3 }' psux.out
Command                    CPU%
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0

Selanjutnya, mari kita manipulasi data di masing-masing bidang.

Manipulasi bidang

Seperti yang telah kita bahas di bagian sebelumnya, awk memahami bidang numerik. Ini memungkinkan Anda untuk melakukan manipulasi data, termasuk perhitungan numerik. Misalnya, pertimbangkan untuk mencetak penggunaan memori pada kolom enam untuk semua firefox proses:

$ awk '/firefox/ { print $11, $6 }' psux.out
/usr/lib64/firefox/firefox 301212
/usr/lib64/firefox/firefox 118220
/usr/lib64/firefox/firefox 168468
/usr/lib64/firefox/firefox 101520
/usr/lib64/firefox/firefox 194336
/usr/lib64/firefox/firefox 111864
/usr/lib64/firefox/firefox 163440
/usr/lib64/firefox/firefox 38496
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 37264
/usr/lib64/firefox/firefox 30608
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 174660

Perintah ps ux menampilkan penggunaan memori dalam Kilobyte, yang sulit dibaca. Mari kita ubah ke Megabyte dengan memasukkan nilai bidang sebesar 1024:

$ awk '/firefox/ { print $11, $6/1024 }' psux.out
/usr/lib64/firefox/firefox 294.152
/usr/lib64/firefox/firefox 115.449
/usr/lib64/firefox/firefox 164.52
/usr/lib64/firefox/firefox 99.1406
/usr/lib64/firefox/firefox 189.781
/usr/lib64/firefox/firefox 109.242
/usr/lib64/firefox/firefox 159.609
/usr/lib64/firefox/firefox 37.5938
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 36.3906
/usr/lib64/firefox/firefox 29.8906
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 170.566

Anda juga dapat membulatkan angka dan menambahkan akhiran MB menggunakan printf untuk meningkatkan keterbacaan:

$ awk '/firefox/ { printf("%s %4.0f MB\n", $11, $6/1024) }' psux.out
/usr/lib64/firefox/firefox  294 MB
/usr/lib64/firefox/firefox  115 MB
/usr/lib64/firefox/firefox  165 MB
/usr/lib64/firefox/firefox   99 MB
/usr/lib64/firefox/firefox  190 MB
/usr/lib64/firefox/firefox  109 MB
/usr/lib64/firefox/firefox  160 MB
/usr/lib64/firefox/firefox   38 MB
/usr/lib64/firefox/firefox  171 MB
/usr/lib64/firefox/firefox   36 MB
/usr/lib64/firefox/firefox   30 MB
/usr/lib64/firefox/firefox  171 MB
/usr/lib64/firefox/firefox  171 MB

Terakhir, gabungkan ide ini dengan BEGIN dan END pola untuk melakukan manipulasi data yang lebih maju. Misalnya, mari kita hitung total penggunaan memori untuk semua firefox proses dengan mendefinisikan variabel jumlah di BEGIN tindakan, menambahkan nilai kolom enam $6 untuk setiap baris yang cocok dengan firefox ke jumlah variabel, dan kemudian mencetaknya dengan END tindakan dalam Megabita:

$ awk 'BEGIN { sum=0 } /firefox/ { sum+=$6 } END { printf("Total Firefox memory: %.0f MB\n", sum/1024) }' psux.out
Total Firefox memory: 1747 MB

[ Unduh sekarang:Panduan sysadmin untuk skrip Bash. ] 

Apa selanjutnya?

gawk adalah alat yang kuat dan fleksibel untuk memproses data teks, terutama data yang disusun dalam kolom. Artikel ini memberikan beberapa contoh berguna dalam menggunakan alat ini untuk mengekstrak dan memanipulasi data, tetapi gawk dapat melakukan lebih banyak lagi. Untuk informasi tambahan tentang gawk , lihat halaman manual di distribusi Linux Anda.

Bahasa Awk memiliki lebih banyak sumber daya daripada yang kami jelajahi dalam panduan ini. Untuk informasi mendetail tentangnya, lihat Panduan Pengguna Awk GNU resmi.


Linux
  1. Panduan praktis untuk belajar awk

  2. Mengekstrak dan menampilkan data dengan awk

  3. Dasar-dasar Linux:Panduan pemula untuk mengedit teks dengan vim

  1. Panduan pemula untuk firewalld di Linux

  2. Panduan Lengkap Pemula untuk LVM di Linux

  3. AWK Vs NAWK Vs GAWK

  1. Panduan pemula untuk izin Linux

  2. Panduan pemula untuk membuat pengalihan dalam file .htaccess

  3. Panduan Lengkap Pemula untuk Docker Logging