Menggunakan grep vs awk

17

Untuk menangkap pola tertentu, awkdan grepbisa 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.

holasz
sumber
Awali setiap perintah, bahkan skrip shell, dengan timeperintah untuk menentukan waktu berapa lama untuk menjalankan perintah. Ex: time ls -l.
Bulrush

Jawaban:

26

grep kemungkinan besar akan lebih cepat:

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

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.

Drav Sloan
sumber
2
Tanpa mengatakan implementasi grep atau awk apa yang Anda gunakan dan pada arsitektur komputer apa, dan dengan set karakter sistem mana, timing tersebut memiliki nilai yang kecil.
Stéphane Chazelas
1
perintah kedua juga akan menggunakan versi yang baru di-cache. Saya tidak ragu bahwa grep lebih cepat tetapi tidak sebanyak yang ditunjukkan oleh angka Anda.
exussum
(karenanya menjalankan awk, grep, awk, grep dan memposting hasil dari set kedua awk dan grep :) dan FYI, saya tinggal di lokal UTF8.
Drav Sloan
1
Cukup lucu, dengan alat BSD (pada Mac), awk (31,74 detik) sedikit lebih cepat daripada sed (33,34 detik), yang sedikit lebih cepat daripada grep (34,21 detik). Gnu awk memiliki semuanya pada 5.24, saya tidak punya gnu grep atau sed untuk diuji.
Kevin
1
grep harus sedikit lebih cepat karena awk melakukan lebih banyak dengan setiap baris input daripada hanya mencari regexp di dalamnya, misalnya jika bidang direferensikan dalam skrip (yang tidak dalam kasus ini) awk akan membagi setiap baris input menjadi bidang berdasarkan pada nilai pemisah bidang dan mengisi variabel bawaan. tetapi dengan apa yang Anda posting seharusnya hampir tidak ada perbedaan. Sejauh ini perbedaan paling penting antara regexps pencocokan grep dan awk wrt adalah bahwa grep mencari seluruh baris untuk string yang cocok sementara awk dapat mencari bidang tertentu sehingga memberikan lebih banyak presisi dan lebih sedikit kecocokan palsu.
Ed Morton
14

Gunakan alat yang paling spesifik dan ekspresif. Alat yang paling sesuai dengan kasus penggunaan Anda kemungkinan merupakan yang tercepat.

Sebagai panduan kasar:

  • mencari garis yang cocok dengan substring atau regexp? Gunakan grep.
  • memilih kolom tertentu dari file yang hanya dibatasi? Gunakan potongan.
  • melakukan pergantian berbasis pola atau ... hal-hal lain yang dapat dilakukan secara wajar? Gunakan sed.
  • perlu beberapa kombinasi dari 3 di atas, atau format printf, atau loop tujuan umum dan cabang? Gunakan awk.
Tak berguna
sumber
+1 kecuali digunakan perlsebagai ganti awk. jika Anda memerlukan sesuatu yang lebih rumit daripada grep / cut / sed, maka kemungkinan awk tidak akan cukup dan Anda membutuhkan sesuatu "full-blown"
sds
@sds mengapa bukan python saja
RetroCode
@ RetroCode: python lebih "tujuan umum" daripada perl; satu-liner yang setara mungkin akan jauh lebih lama.
sds
3
@sds tidak, Anda tidak perlu perl kecuali Anda akan melakukan sesuatu selain pemrosesan teks. awk baik-baik saja untuk hal-hal pemrosesan teks yang lebih rumit daripada grep / cut / sed dan sebagai bonus datang sebagai standar pada semua instalasi UNIX, tidak seperti perl.
Ed Morton
10

Saat hanya mencari string, dan mempercepat, Anda harus selalu menggunakannya grep. Ini perintah besarnya lebih cepat daripada awkketika datang ke pencarian hanya kotor.

source Perbedaan fungsional dan kinerja dari sed, awk, dan utilitas parsing Unix lainnya

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million
slm
sumber
1
Terima kasih atas ikhtisar yang bagus dari semua program ini. Itu benar-benar memberi cahaya dalam kegelapan.
holasz
1
~ headtilt ~ PHP ada di sana tetapi Perl tidak?
Izkata
@Izkata - Saya memikirkan hal yang sama ketika saya melihat tabel ini beberapa waktu yang lalu.
slm
1
Itu tidak benar-benar adil untuk utilitas lain bahwa grep hanya mencari dan mereka juga mengganti.
Kevin
1
Itu benar-benar angka palsu. Bicara tentang membandingkan apel dan jeruk - itu seperti mengatakan Anda hanya dapat menemukan mobil baru di situs web A dalam 5 detik sedangkan Anda dapat menemukan mobil, menegosiasikan harga, mendapatkan pinjaman, dan membeli mobil di situs B dalam 1 jam sehingga oleh karena itu situs A lebih cepat daripada situs B. Artikel yang Anda kutip sepenuhnya salah dalam pernyataan kecepatan eksekusi relatif antara grep, sed, dan awk dan juga mengatakan awk ... has PCRE matching for regular expressionsyang sama sekali tidak benar.
Ed Morton
5

Sementara saya setuju bahwa secara teori grepharus lebih cepat daripada awk, 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.

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

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, awkharus dibandingkan dengan grep -Esebagai awkregexps 's yang Res diperpanjang.

Untuk dataset ini, awkbisa lebih cepat daripada greppada sistem berbasis busybox atau sistem di mana mawkdefault awkdan lokal default adalah berbasis UTF-8 (IIRC, dulu di Ubuntu).

Stéphane Chazelas
sumber
2

Singkatnya, grepmelakukan 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.

dsmsk80
sumber