Apakah masih ada alasan untuk mempelajari AWK?

109

Saya terus mempelajari alat-alat baru, bahkan yang kuno, karena saya suka menggunakan solusi yang tepat untuk masalah tersebut.

Meskipun demikian, saya bertanya-tanya apakah masih ada alasan untuk mempelajarinya. awkmisalnya menarik untuk saya, tapi untuk pengolahan teks sederhana, saya dapat menggunakan grep, cut, sed, dll sedangkan untuk yang kompleks, saya akan pergi untuk Python.

Sekarang saya tidak bermaksud bahwa itu bukan alat yang ampuh dan praktis. Tetapi karena mempelajari alat baru membutuhkan waktu dan energi, apakah itu sepadan ?

e-satis
sumber
2
ini 2019 dan saya baru saja menulis ulang normalizer log python di awk. Saya menjalankan transformasi pada minggu file log yang 54 juta file log baris (~ 9GB). Di Macbook Pro saya (2,8 GHZ i7, 16 GB Ram), versi python dapat memproses ~ 10k baris per detik => 90 menit runtime. Dengan menggunakan mawk, waktu berjalan dikurangi menjadi 2 menit. Btw, program awk setengah ukurannya.
mistahenry
@mistahenry apakah Anda mencoba pypy?
qwr

Jawaban:

97

Saya pikir itu tergantung pada lingkungan tempat Anda berada. Jika Anda adalah orang * nix, maka mengetahui awkadalah Hal yang Baik. Satu-satunya lingkungan skrip lain yang dapat ditemukan di hampir setiap * nix adalah sh. Jadi sementara grep, sed,dll pasti dapat menggantikan awkpada linuxdistro arus utama modern , ketika Anda pindah ke sistem yang lebih eksotis, mengetahui sedikit awkakan menjadi Berguna Nyata.

awkjuga dapat digunakan untuk lebih dari sekadar pemrosesan teks. Misalnya salah satu pengawas saya menulis kode astronomi di awk- begitulah sekolah tua dan hebatnya dia. Dulu, itu adalah alat terbaik untuk pekerjaan itu ... dan sekarang meskipun murid-muridnya seperti saya menggunakan python dan yang tidak, dia tetap berpegang pada apa yang dia ketahui dan bekerja dengan baik.

Sebagai penutup, ada banyak kode lama yang muncul di seluruh dunia, mengetahui sedikit awktidak akan merugikan. Ini juga akan membuat Anda lebih baik * nix person :-)

ruang bebas
sumber
12
++ Setuju, awk benar-benar adalah salah satu alat yang paling portabel, dan yang terpenting, alat yang konsisten di set alat * nix. Ia bekerja dengan andal di busybox, misalnya, di mana perl tidak bisa ditemukan.
senjata
1
Dan sebenarnya tidak terlalu sulit untuk mempelajarinya jika Anda terbiasa menggunakan bahasa kurung kurawal
senjata
2
"Ini sama di lingkungan mana pun" - tidak sepenuhnya: di bawah tanda kutip tunggal Windows harus diganti dengan ganda, s dan ganda internal harus dihilangkan. (Windows adalah semacam lingkungan nyata, bahkan jika mengekspos diri Anda pada kekejaman setengah jadi Redmond yang tidak aman membuat Anda bergantung pada belas kasihan setiap orang Rusia berusia 15 tahun).
GT.
6
Saya rasa tidak banyak orang yang mengasosiasikan keberadaan awk dan windows di alam semesta yang sama .....: P
FoldedChromatin
2
Masih menggunakan awk untuk pekerjaan pemrosesan teks. Saya akan sering memulai skrip dengan sesuatu yang lain (ruby, python) dan akhirnya kembali ke awk untuk kesederhanaan dan kekuatan.
Rumbleweed
103

Jika Anda mempelajari dasar-dasar awk dengan cepat, Anda memang dapat melakukan hal-hal luar biasa pada baris perintah.

Tetapi alasan sebenarnya untuk belajar awk adalah memiliki alasan untuk membaca buku hebat The AWK Programming Language oleh penulisnya Aho, Kernighan, dan Weinberger. Anda akan berpikir, dari namanya, itu hanya mengajarkan Anda awk. Sebenarnya itu baru permulaan. Meluncurkan ke dalam berbagai macam masalah yang dapat ditangani setelah seseorang menggunakan bahasa skrip yang ringkas yang membuat manipulasi string menjadi mudah - dan awk adalah salah satu yang pertama - ia melanjutkan untuk mengajari pembaca cara mengimplementasikan database, parser, dan interpreter , dan (jika memori melayani saya) kompiler untuk bahasa komputer khusus proyek kecil! Andai saja mereka juga memprogram sebuah contoh sistem operasi menggunakan awk, buku itu akan menjadi survei pengenalan ilmu komputer yang cukup lengkap!

Jelas terkenal dan ringkas, seperti buku Bahasa C asli, ini juga merupakan contoh bagus dari penulisan teknis ramah yang dilakukan dengan benar. Bahkan indeks adalah sebuah karya seni.

Awk? Jika Anda mengetahuinya, Anda akan menggunakannya di baris perintah sesekali, tetapi untuk sesuatu yang lebih besar Anda akan merasa terjebak, tidak dapat mengakses fitur yang lebih luas dari sistem Anda dan Internet yang dapat diakses oleh sesuatu seperti Python. Tapi bukunya? Anda akan selalu senang membacanya!

Brandon Rhodes
sumber
5
+1 Terjual. Saya akan memesan buku ini. Saya telah menggunakan awk selama bertahun-tahun sebagai bahasa skrip satu baris yang cepat dan kuat. Awk adalah pra-prosesor yang bagus untuk file yang seharusnya membutuhkan selusin baris untuk dikodekan. Saya tidak dapat menghitung berapa kali saya telah menggunakan formulir: awk '{print $ 1, $ 2}'
galaxywatcher
2
Sepakat. Ini hampir menyangkal keyakinan betapa kompak buku itu diberikan semua isinya. Ini mencakup lebih dari kebanyakan buku kontemporer dalam 1/10 (?) Panjangnya.
tanah liat
3
Saya sedang membaca buku ini sekarang dan itu telah mengobarkan antusiasme saya untuk hampir menjadi obsesi.
galaxywatcher
3
Lihat juga Gawk yang sangat baik : Pemrograman AWK yang Efektif .
lhf
1
Saya baru saja membaca bab pertama. Sungguh menakjubkan. Mistery terselesaikan.
vaichidrewar
29

Satu-satunya alasan saya menggunakan awkadalah pemisahan otomatis:

awk '{print $3}' < file.in

Ini mencetak bidang dipisahkan spasi ketiga di file.in. Ini sedikit lebih mudah daripada:

tr -s ' ' < file.in | cut -d' ' -f3
Greg Hewgill
sumber
3
mengapa digunakan, awk '{print $3}' < file.inbukan awk '{print $3}' file.in? Bukankah awk sudah membaca file saat diteruskan sebagai argumen?
mbigras
@mbigras Tentu, Anda dapat menggunakan awk dengan cara apa pun.
Greg Hewgill
Bahkan dengan penggandaan, saya suka solusi non-awk. Dan saya tidak tahu mengapa saya benci awk: /
MD. Mohiuddin Ahmed
25

Saya pikir awk bagus jika file Anda berisi kolom / bidang . Saya menggunakannya saat memproses / menganalisis kolom tertentu dalam file multikolom. Atau jika saya ingin menambah / menghapus kolom tertentu.

misalnya

awk -F \t '{ if ($2 > $3) print; }' <filename>

akan mencetak hanya jika nilai kolom ke-2 dalam file yang dipisahkan tab lebih besar dari nilai kolom ke-3.

Tentu saja saya dapat menggunakan Perl atau Python, tetapi awk membuatnya lebih sederhana dengan perintah baris tunggal yang ringkas.

Juga mempelajari awk cukup murah. Anda dapat mempelajari dasar-dasar awk dalam waktu kurang dari satu jam, jadi tidak sesulit mempelajari bahasa pemrograman / skrip lainnya.

Nikhil
sumber
Meskipun saya tidak terlalu banyak menggunakan awk, ini sangat berguna untuk awk.
Paul Nathan
8

Saya menggunakan AWK sesekali untuk menangani HTML. Misalnya, kode ini menerjemahkan tabel menjadi file csv:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Yang bagus jika Anda menggesek layar. Sebenarnya, mungkin saya suka AWK karena memungkinkan saya membuat solusi yang salah untuk masalah dengan sangat cepat :) lebih banyak contoh . Ini juga disebutkan dalam Mutiara Pemrograman Jon Bentley yang indah .

Dave
sumber
7

Saya sering menggunakan awk. Ini bagus untuk pengacakan teks yang sangat sederhana di tengah-tengah pipeline; itu mengisi ceruk yang sangat sempit di antara tidak membutuhkannya sama sekali dan perlu mengeluarkan Perl / Python / apapun.

Saya tidak akan menyarankan Anda menghabiskan banyak waktu untuk itu, tetapi mungkin berguna untuk mengetahui dasar-dasar sintaks - setidaknya cukup sehingga Anda dapat membaca manual dengan cepat jika Anda ingin menggunakannya.

Eevee
sumber
5

Kebanyakan awk one liner dapat dicapai dengan Perl one liners - jika Anda memilih untuk mengikuti pola pikir Perl one liner. Atau, cukup gunakan Perl three liners :)

Jika Anda mempertahankan skrip shell yang ditulis oleh seseorang yang menyukai awk, maka jelas, Anda perlu belajar awk.

Bahkan jika tidak ada kebutuhan praktis, jika Anda sudah tahu regex, tidak akan butuh waktu lama untuk mempelajari dasar-dasarnya, dan menyenangkan untuk melihat bagaimana berbagai hal dirancang saat itu. Agak elegan.

ramping
sumber
5

6 tahun setelah menanyakan pertanyaan ini, saya sekarang dapat menjawab dengan pasti: tidak, belajar awk tidak sepadan.

Tugas dasar ditangani tetapi perintah bash dasar, atau bahkan alat GUI dengan mudah. Tugas yang lebih kompleks akan mudah ditangani dengan bahasa dinamis modern seperti Python (fav atau mine) atau Ruby.

Anda harus mempelajari bahasa dinamis skrip mordern karena akan membantu Anda dalam banyak tugas (web, admin, data crunching, otomatisasi, dll). Dan dengan melakukan itu mempelajari alat seperti awk sama sekali tidak berguna, ini akan menghemat beberapa detik setiap bulan.

e-satis
sumber
2
Belum tentu benar. Jika Anda mengurai file yang sangat besar, ini bisa menjadi lebih cepat daripada alat lainnya.
pengguna1071847
Menarik karena beberapa tahun setelah ini Anda masih menanyakan pertanyaan tentang awk. Saya adalah salah satu responden asli dan masih menggunakannya dengan beberapa keteraturan hingga hari ini
Dexygen
4

Jika Anda sudah tahu dan menggunakan sed, Anda sebaiknya mengambil setidaknya sedikit awk. Mereka dapat disatukan untuk beberapa trik yang cukup kuat. Selalu mengesankan penonton.

Teman Internet
sumber
4

Computerworld baru-baru ini melakukan wawancara dengan Alfred V. Aho (salah satu dari tiga pencipta AWK) tentang AWK. Bacaan yang cukup menarik. Jadi mungkin Anda akan menemukan beberapa petunjuk di dalamnya, mengapa mempelajari AWK adalah ide yang bagus.

dlat
sumber
Bagus, tapi tidak meyakinkan saya. AWK adalah alat yang sangat bagus, tapi saya rasa saya tidak akan pernah cukup membutuhkannya untuk meluangkan waktu untuk mempelajarinya daripada meretas solusi saya dengan sed atau python.
e-satis
4

Mempelajari AWK sangat berharga bagi saya dalam kontrak terakhir saya yang bekerja pada sistem Linux tertanam yang tidak menggunakan Perl atau sebagian besar bahasa skrip lainnya.

Dexygen
sumber
2
9 tahun kemudian dan saya menggunakan banyak awk hari ini saat mengambil git logs
Dexygen
3

awk memiliki rasio utilitas / kesulitan yang sangat baik, dan "awk sederhana" berfungsi di setiap Unix / Linux / MacOS (dan dapat diinstal di sistem lain juga).

Ini dirancang di Zaman Keemasan ketika orang tidak suka mengetik, jadi skrip bisa sangat, sangat pendek dan cepat untuk ditulis. Saya akan coba instal mawk, versi cepat, diduga mempercepat komputasi sekitar 9 kali, awk / gawk agak lambat, jadi jika Anda ingin menggunakannya daripada R dll, Anda mungkin ingin mawk.

BongBong Chu
sumber
2

Ini berguna terutama jika Anda kadang-kadang harus mengurai file log untuk data atau output program saat skrip shell, karena sangat mudah dicapai dalam awk yang akan membawa Anda lebih banyak baris kode dalam python.

Ini tentu memiliki kekuatan lebih dari itu, tetapi tampaknya ini adalah tugas yang kebanyakan orang gunakan.

NeuroSys
sumber
2

Tentu saja: Saya bekerja di lingkungan di mana satu-satunya bahasa yang tersedia adalah: (beberapa bahasa shity yang menghasilkan COBOL, OMG, OMG), bash (versi lama), perl (saya belum menguasainya), sed, awk , dan beberapa utilitas baris perintah lainnya. Mengetahui awkmenyelamatkan saya beberapa jam (dan telah menghasilkan beberapa tugas pemrosesan teks dari kolega saya - mereka datang kepada saya setidaknya tiga kali sehari).

Zsolt Botykai
sumber
1

Saya akan mengatakan itu mungkin tidak layak lagi. Saya menggunakannya dari waktu ke waktu sebagai editor aliran yang jauh lebih serbaguna daripada sed dengan kemampuan pencarian yang disertakan, tetapi jika Anda mahir dengan python, saya tidak tahu tugas yang akan dapat Anda selesaikan lebih cepat untuk mengimbangi waktu yang dibutuhkan untuk belajar awk.

Perintah berikut mungkin satu-satunya yang saya gunakan awk dalam dua tahun terakhir (ini membersihkan paket yang setengah dihapus dari sistem Debian / Ubuntu saya):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P
Matthias Kestenholz
sumber
1

Nggak.

Meskipun mungkin menarik, Anda dapat melakukan semua hal yang awk dapat lakukan menggunakan alat lain yang lebih canggih seperti Perl.

Habiskan waktu Anda mempelajari alat-alat yang lebih kuat itu - dan hanya secara tidak sengaja mengambil beberapa canggung di sepanjang jalan.

Ed Guinness
sumber
1

Saya akan mengatakan ada. Untuk hal-hal sederhana, AWK jauh lebih mudah di sysadmin / developer yang tidak berpengalaman daripada Python. Anda bisa belajar sedikit AWK dan melakukan banyak hal, belajar Python berarti belajar bahasa baru (ya, saya tahu AWK adalah bahasa juga pengertian).

Perl mungkin dapat melakukan banyak hal yang dapat dilakukan AWK, tetapi menawarkan pilihan di zaman sekarang ini, saya akan memilih Python di sini. Jadi ya, Anda harus mempelajari AWK. tapi pelajari Python juga :-)

wzzrd.dll
sumber
1

awkadalah bahasa powertool, jadi Anda mungkin akan menemukan awkdigunakan di suatu tempat jika Anda adalah seorang profesional TI dalam bentuk apa pun. Jika Anda dapat menangani sintaks dan ekspresi reguler grepdan sedseharusnya tidak ada masalah untuk mengambilnyaawk dan mungkin bermanfaat.

Di mana saya merasa awksangat bersinar adalah dalam menyederhanakan hal-hal seperti memproses catatan multi-baris dan mengacaukan / menginterpolasi banyak file secara bersamaan.


sumber
0

Sekarang PERL di-porting ke hampir semua platform penting, menurut saya itu tidak sepadan. Ini lebih fleksibel daripada sed dan awk together. Sedangkan untuk pemisahan otomatis, Anda dapat melakukannya di perl seperti ini:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

EDIT: Anda mungkin masih ingin mendapatkan agak berkenalan dengan awk, karena beberapa alat lain didasarkan pada filosofi tindakan berbasis pola (misalnya DTrace pada Solaris).

zvrba
sumber
0

Saya bekerja di area file dalam format kolom. Jadi awk sangat berharga bagi saya untuk MEREFORMASI file sehingga perangkat lunak yang berbeda dapat bekerja sama. Untuk profesi non IT, menggunakan awk sudah cukup dan sempurna. Sekarang hari, kecepatan komputer tidak menjadi masalah, jadi saya bisa menggabungkan awk & unix untuk menyalurkan banyak perintah 1 liners ke dalam "skrip". Dengan pencarian Awk berdasarkan bidang dan catatan, saya menggunakannya untuk memeriksa data file dengan sangat cepat, daripada "vi" untuk membuka file. Saya harus mengatakan kemampuan awk membawa kegembiraan ke pekerjaan saya secara khusus, saya dapat membantu rekan kerja untuk menyelesaikan masalah dengan cepat menggunakan awk. Kode luar biasa bagi saya.

Hai Truong
sumber
0

Saya baru-baru ini mencoba untuk memvisualisasikan file pcap jaringan mencatat serangan DOS yang berjumlah lebih dari 20Gbs. Saya membutuhkan cap waktu dan alamat Ip. Dalam skenario saya, AWK one-liner bekerja dengan sangat baik dan cukup cepat juga. Saya secara khusus menggunakan AWK untuk membersihkan file yang diekstrak, mendapatkan alamat ip dan jumlah total paket dari alamat IP tersebut dalam rentang waktu yang dikelompokkan. Saya sangat setuju dengan apa yang orang lain tulis di atas. Semua tergantung dari kebutuhan Anda.

Ash Catchem
sumber
0

Salah satu alasan untuk TIDAK mempelajari awk adalah karena tidak memiliki kecocokan non-serakah dalam ekspresi reguler.

Saya memiliki kode awk yang sekarang harus saya tulis ulang hanya karena saya tiba-tiba men-debug bahwa tidak ada yang namanya pertandingan tidak serakah di awk / gawk sehingga tidak dapat mengeksekusi beberapa regex dengan benar.

pengguna619271
sumber
0

Itu tergantung pada rekan satu tim Anda dan Anda pemimpin dan tugas yang sedang Anda kerjakan.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}
Kenneth
sumber
0

Saya telah melakukan beberapa pengkodean dengan python saat ini. Tapi saya masih belum cukup paham untuk menggunakannya dengan mudah untuk transformasi file sederhana.

Dengan awk saya dapat dengan cepat mengembangkan sepotong kode satu baris pada baris perintah unix yang melakukan beberapa transformasi yang cukup desir. Setiap kali saya menggunakan awk, potongan kode yang saya tulis akan dapat dibuang dan panjangnya tidak lebih dari beberapa baris. Mungkin pernyataan "jika" dan pernyataan "printf" di sini atau di sana dalam satu baris.

Saya tidak pernah menulis kode yang panjangnya lebih dari 10 baris dengan awk. Saya melihat beberapa skrip seperti itu bertahun-tahun yang lalu.

Tetapi apa pun yang membutuhkan banyak baris kode, saya akan menggunakan python.

Saya suka awk. Ini adalah alat yang sangat kuat dalam kombinasi dengan sed.

pengguna5901715
sumber