Untuk menangkap pola tertentu, awk
dan grep
bisa digunakan. Mengapa kita harus menggunakan yang satu di atas yang lain? Mana yang lebih cepat dan mengapa?
Jika saya memiliki file log dan saya ingin mengambil pola tertentu, saya bisa melakukan salah satu dari yang berikut ini
awk '/pattern/' /var/log/messages
atau
grep 'pattern' /var/log/messages
Saya belum melakukan benchmarking, jadi saya tidak akan tahu. Bisakah seseorang menjelaskan hal ini? Sangat menyenangkan mengetahui cara kerja kedua alat ini.
linux
awk
grep
performance
holasz
sumber
sumber
time
perintah untuk menentukan waktu berapa lama untuk menjalankan perintah. Ex:time ls -l
.Jawaban:
grep kemungkinan besar akan lebih cepat:
awk adalah bahasa pemrograman yang ditafsirkan, di mana grep adalah program kode-c yang dikompilasi (yang juga dioptimalkan untuk menemukan pola dalam file).
(Catatan - Saya menjalankan kedua perintah dua kali sehingga caching tidak berpotensi memunculkan hasil)
Lebih detail tentang bahasa yang ditafsirkan di wikipedia.
Seperti yang ditunjukkan Stephane dengan benar dalam komentar, jarak tempuh Anda dapat bervariasi karena penerapan grep dan awk yang Anda gunakan, sistem operasi yang dihidupkan dan karakter yang Anda proses.
sumber
Gunakan alat yang paling spesifik dan ekspresif. Alat yang paling sesuai dengan kasus penggunaan Anda kemungkinan merupakan yang tercepat.
Sebagai panduan kasar:
sumber
perl
sebagai gantiawk
. jika Anda memerlukan sesuatu yang lebih rumit daripada grep / cut / sed, maka kemungkinan awk tidak akan cukup dan Anda membutuhkan sesuatu "full-blown"Saat hanya mencari string, dan mempercepat, Anda harus selalu menggunakannya
grep
. Ini perintah besarnya lebih cepat daripadaawk
ketika datang ke pencarian hanya kotor.source Perbedaan fungsional dan kinerja dari sed, awk, dan utilitas parsing Unix lainnya
sumber
awk ... has PCRE matching for regular expressions
yang sama sekali tidak benar.Sementara saya setuju bahwa secara teori
grep
harus lebih cepat daripadaawk
, dalam praktiknya, YMMV karena itu sangat tergantung pada implementasi yang Anda gunakan.di sini membandingkan busybox 1.20.0 grep dan awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 pada Debian / Linux 7.0 amd64 (dengan glibc 2.17) di lokal UTF-8 pada file 240MB dari file 2.5MB dari baris 2.5M dari Hanya karakter ASCII.
Di lokal C, hanya grep GNU yang mendapat dorongan signifikan dan menjadi lebih cepat dari
mawk
.Dataset, jenis regexp juga dapat membuat perbedaan besar. Untuk regexps,
awk
harus dibandingkan dengangrep -E
sebagaiawk
regexps 's yang Res diperpanjang.Untuk dataset ini,
awk
bisa lebih cepat daripadagrep
pada sistem berbasis busybox atau sistem di manamawk
defaultawk
dan lokal default adalah berbasis UTF-8 (IIRC, dulu di Ubuntu).sumber
Singkatnya,
grep
melakukan satu hal hanya sebanyak alat UNIX lainnya dan itu mencocokkan garis dengan pola yang diberikan dan melakukannya dengan baik. Di samping itu,awk
alat ini lebih canggih karena merupakan bahasa pemrograman lengkap yang didefinisikan oleh standar POSIX dengan fitur-fitur khas seperti variabel, array, ekspresi, fungsi atau pernyataan kontrol untuk pemindaian dan pemrosesan pola.Menurut pendapat saya, itu tergantung pada implementasi bagaimana kedua alat bekerja dalam kasus pencocokan pola dan pada ukuran beberapa input yang ingin Anda proses. Saya berharap bahwa grep biasanya lebih efisien daripada awk karena hanya cocok. Tetapi Anda tidak dapat menulis dengan grep kode sederhana untuk melakukan tugas yang lebih kompleks seperti pemrosesan lebih lanjut dari catatan yang cocok, perhitungan atau hasil pencetakan tanpa menggunakan alat lain.
sumber