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.