Bahasa pemrograman awk mendukung array. Sebagai bagian dari rangkaian contoh awk yang sedang berjalan, kami telah melihat variabel yang ditentukan pengguna awk dan variabel bawaan awk. Array adalah perpanjangan dari variabel. Array adalah variabel yang menyimpan lebih dari satu nilai. Mirip dengan variabel, array juga memiliki nama. Dalam beberapa bahasa pemrograman, array harus dideklarasikan, sehingga memori akan dialokasikan untuk array. Selain itu, indeks larik biasanya bilangan bulat, seperti larik[1],array[2] dll.,
Array Asosiatif Awk
Awk hanya mendukung array asosiatif. Array asosiatif seperti array tradisional kecuali mereka menggunakan string sebagai indeks daripada angka. Saat menggunakan array asosiatif, Anda dapat meniru array tradisional dengan menggunakan string numerik sebagai indeks.
Syntax: arrayname[string]=value
Dalam sintaks awk di atas:
- nama array adalah nama lariknya.
- string adalah indeks larik.
- nilai adalah nilai apa pun yang ditetapkan ke elemen larik.
Mengakses elemen larik AWK
Jika Anda ingin mengakses elemen tertentu dalam larik, Anda dapat mengaksesnya melalui indeksnya — namaarray[index], yang memberi Anda nilai yang ditetapkan dalam indeks itu.
Jika Anda ingin mengakses semua elemen array, Anda dapat menggunakan loop untuk menelusuri semua indeks array seperti yang ditunjukkan di bawah ini.
Syntax: for (var in arrayname) actions
Dalam sintaks awk di atas:
- var adalah nama variabel apa saja
- di adalah kata kunci
- nama array adalah nama lariknya.
- tindakan adalah daftar pernyataan yang akan dilakukan. Jika Anda ingin melakukan lebih dari satu tindakan, tindakan tersebut harus diapit dengan kurung kurawal.
Loop ini mengeksekusi daftar tindakan untuk setiap nilai berbeda yang digunakan sebagai indeks dalam larik dengan variabel var disetel ke indeks itu.
Menghapus elemen dari larik AWK
Jika Anda ingin menghapus elemen dalam indeks array tertentu, gunakan pernyataan hapus awk. Setelah Anda menghapus elemen dari larik awk, Anda tidak dapat lagi memperoleh nilai tersebut.
Syntax: delete arrayname[index];
Perintah loop di bawah ini menghapus semua elemen dari array. Tidak ada pernyataan tunggal untuk menghapus semua elemen dari array. Anda harus melalui loop dan menghapus setiap elemen array menggunakan pernyataan hapus awk.
for (var in array) delete array[var]
5 Contoh Array Awk Praktis
Semua contoh yang diberikan di bawah ini menggunakan file Iplogs.txt yang ditunjukkan di bawah ini. File teks sampel ini berisi daftar alamat ip yang diminta oleh server gateway. Contoh file Iplogs.txt ini berisi data dalam format berikut:
[date] [time] [ip-address] [number-of-websites-accessed]
$ cat Iplogs.txt 180607 093423 123.12.23.122 133 180607 121234 125.25.45.221 153 190607 084849 202.178.23.4 44 190607 084859 164.78.22.64 12 200607 012312 202.188.3.2 13 210607 084849 202.178.23.4 34 210607 121435 202.178.23.4 32 210607 132423 202.188.3.2 167
Contoh 1. Cantumkan semua alamat IP unik dan berapa kali itu diminta
$ awk '{ > Ip[$3]++; > } > END{ > for (var in Ip) > print var, "access", Ip[var]," times" > } > ' Iplogs.txt 125.25.45.221 access 1 times 123.12.23.122 access 1 times 164.78.22.64 access 1 times 202.188.3.2 access 2 times 202.178.23.4 access 3 times
Dalam skrip di atas:
- Kolom ketiga ($3) adalah alamat ip. Ini digunakan sebagai indeks dari array yang disebut Ip.
- Untuk setiap baris, itu menambah nilai indeks alamat ip yang sesuai.
- Terakhir di bagian END, semua indeks akan menjadi daftar alamat IP unik dan nilai yang sesuai adalah jumlah kemunculannya.
Contoh 2. Cantumkan semua alamat IP dan hitung berapa banyak situs yang diaksesnya
Bidang terakhir di Iplogs.txt adalah jumlah situs yang diakses setiap alamat IP pada tanggal dan waktu tertentu. Skrip di bawah ini menghasilkan laporan yang memiliki daftar alamat IP dan berapa kali ia meminta gateway dan jumlah total situs yang diaksesnya.
$cat ex2.awk BEGIN { print "IP Address\tAccess Count\tNumber of sites"; } { Ip[$3]++; count[$3]+=$NF; } END{ for (var in Ip) print var,"\t",Ip[var],"\t\t",count[var]; } $ awk -f ex2.awk Iplogs.txt IP Address Access Count Number of sites 125.25.45.221 1 153 123.12.23.122 1 133 164.78.22.64 1 12 202.188.3.2 2 180 202.178.23.4 3 110
Pada contoh di atas:
- Memiliki dua array. Indeks untuk kedua array sama — yang merupakan alamat IP (bidang ketiga).
- Array pertama bernama “Ip” memiliki daftar alamat IP unik dan jumlah kemunculannya. Array kedua yang disebut "count" memiliki alamat IP sebagai indeks dan nilainya akan menjadi bidang terakhir (jumlah situs), jadi setiap kali alamat IP datang, ia terus menambahkan bidang terakhir.
- Di bagian END, ia menelusuri semua alamat IP dan mencetak alamat Ip dan jumlah akses dari larik yang disebut Ip dan jumlah situs dari jumlah larik.
Contoh 3. Identifikasi hari akses maksimum
$ cat ex3.awk { date[$1]++; } END{ for (count in date) { if ( max < date[count] ) { max = date[count]; maxdate = count; } } print "Maximum access is on", maxdate; } $ awk -f ex3.awk Iplogs.txt Maximum access is on 210607
Dalam contoh ini:
- array bernama “date” memiliki tanggal sebagai indeks dan jumlah kemunculan sebagai nilai array.
- max adalah variabel yang memiliki nilai count dan digunakan untuk mengetahui tanggal yang memiliki max count.
- maxdate adalah variabel yang memiliki tanggal jumlah maksimum.
Contoh 4. Membalikkan urutan baris dalam file
$ awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' Iplogs.txt 210607 132423 202.188.3.2 167 210607 121435 202.178.23.4 32 210607 084849 202.178.23.4 34 200607 012312 202.188.3.2 13 190607 084859 164.78.22.64 12 190607 084849 202.178.23.4 44 180607 121234 125.25.45.221 153 180607 093423 123.12.23.122 133
Dalam contoh ini,
- Ini dimulai dengan merekam semua baris dalam array 'a'.
- Ketika program telah selesai memproses semua baris, Awk mengeksekusi blok END { }.
- Blok END mengulang elemen dalam larik 'a' dan mencetak baris yang direkam secara terbalik.
Contoh 5. Hapus baris duplikat dan tidak berurutan menggunakan awk
$ cat > temp foo bar foo baz bar $ awk '!($0 in array) { array[$0]; print }' temp foo bar baz
Dalam contoh ini:
- Awk membaca setiap baris dari file “temp”, dan menggunakan operator “in” untuk memeriksa apakah baris saat ini ada dalam array “a”.
- Jika tidak ada, ia menyimpan dan mencetak baris saat ini.
Bacaan yang Disarankan
Sed dan Awk 101 Hacks, oleh Ramesh Natarajan . Saya menghabiskan beberapa jam sehari di lingkungan UNIX / Linux yang berurusan dengan file teks (data, konfigurasi, dan file log). Saya menggunakan Sed dan Awk untuk semua pekerjaan manipulasi teks saya. Berdasarkan pengalaman Sed dan Awk saya, saya telah menulis eBook Sed dan Awk 101 Hacks yang berisi 101 contoh praktis tentang berbagai fitur canggih Sed dan Awk yang akan meningkatkan kehidupan UNIX / Linux Anda. Bahkan jika Anda telah menggunakan Sed dan Awk selama beberapa tahun dan belum membaca buku ini, bantulah diri Anda sendiri dan baca buku ini. Anda akan kagum dengan kemampuan utilitas Sed dan Awk.