ใช้ grep vs awk


17

เพื่อจับภาพรูปแบบเฉพาะawkและgrepสามารถนำมาใช้ ทำไมเราควรใช้อันอื่น เร็วกว่าไหนและเพราะอะไร

ถ้าฉันมีล็อกไฟล์และฉันต้องการคว้ารูปแบบบางอย่างฉันสามารถทำอย่างใดอย่างหนึ่งต่อไปนี้

awk '/pattern/' /var/log/messages

หรือ

grep 'pattern' /var/log/messages

ฉันยังไม่ได้ทำการเปรียบเทียบดังนั้นฉันไม่รู้เลย ใครบางคนสามารถอธิบายรายละเอียดนี้ เป็นเรื่องดีที่ได้ทราบการทำงานภายในของเครื่องมือทั้งสองนี้


นำหน้าคำสั่งใด ๆ แม้แต่เชลล์สคริปต์ด้วยtimeคำสั่งในเวลาที่ใช้ในการรันคำสั่ง time ls -lEx:
Bulrush

คำตอบ:


26

grep น่าจะเร็วกว่า:

# 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 เป็นภาษาการเขียนโปรแกรมที่ถูกตีความโดยที่ grep เป็นโปรแกรม c-code ที่คอมไพล์แล้ว

(หมายเหตุ - ฉันรันทั้งสองคำสั่งเพื่อให้การแคชไม่ทำให้ผลลัพธ์เอียง)

รายละเอียดเพิ่มเติมเกี่ยวกับการตีความภาษาในวิกิพีเดีย

เมื่อสเตฟานชี้ให้เห็นอย่างถูกต้องในความคิดเห็นระยะของคุณอาจแตกต่างกันเนื่องจากการใช้ grep และ awk ที่คุณใช้ระบบปฏิบัติการที่เปิดอยู่และชุดอักขระที่คุณกำลังประมวลผล


2
โดยไม่ต้องพูดว่าการใช้ grep หรือ awk ใดที่คุณใช้และสถาปัตยกรรมคอมพิวเตอร์ใดและด้วยชุดอักขระของระบบการกำหนดเวลาเหล่านั้นมีค่าน้อย
Stéphane Chazelas

1
คำสั่งที่สองจะใช้เวอร์ชันแคชใหม่ ฉันไม่สงสัยเลยว่า grep นั้นเร็วกว่า แต่ไม่มากเท่าที่ตัวเลขของคุณแสดง
exussum

(ด้วยการรัน awk, grep, awk, grep และโพสต์ผลลัพธ์จากชุดที่สองของ awk และ grep :) และ FYI ฉันอาศัยอยู่ในโลแคล UTF8
Drav Sloan

1
ตลกพอเครื่องมือ BSD (สำหรับ Mac) awk (31.74s) นั้นเร็วกว่า sed (33.34s) เล็กน้อยซึ่งเร็วกว่า grep (34.21s) เล็กน้อย Gnu awk เป็นเจ้าของพวกเขาทั้งหมดในช่วง 5.24 ปีฉันไม่มี gren gp หรือทดสอบไม่ได้
เควิน

1
grep ควรเร็วขึ้นเล็กน้อยเนื่องจาก awk ทำอะไรได้มากกว่ากับแต่ละบรรทัดอินพุตมากกว่าแค่ค้นหา regexp ในนั้นเช่นถ้ามีการอ้างอิงฟิลด์ในสคริปต์ (ซึ่งไม่ใช่ในกรณีนี้) awk จะแบ่งแต่ละบรรทัดออกเป็นฟิลด์ตาม ค่าตัวคั่นฟิลด์และมันจะเติมตัวแปรบิวด์อิน แต่ด้วยสิ่งที่คุณโพสต์ไม่น่าจะมีความแตกต่าง โดยไกลแตกต่างที่สำคัญที่สุดระหว่าง grep และ awk WRT regexps จับคู่ว่าการค้นหา grep สายทั้งสำหรับการจับคู่สายในขณะที่ awk สามารถค้นหาเฉพาะสาขาและเพื่อให้มีความแม่นยำมากขึ้นและการแข่งขันที่ผิดพลาดน้อยลง
เอ็ดมอร์ตัน

14

ใช้เครื่องมือที่เจาะจงที่สุดและสื่อความหมายได้มากที่สุด เครื่องมือที่เหมาะกับกรณีการใช้งานของคุณน่าจะเร็วที่สุด

เป็นแนวทางคร่าวๆ:

  • กำลังค้นหาบรรทัดที่ตรงกับสตริงย่อยหรือ regexp หรือไม่ ใช้ grep
  • เลือกคอลัมน์ที่ต้องการจากไฟล์แบบมีตัวคั่น ใช้ตัด
  • ดำเนินการแทนตามรูปแบบหรือ ... สิ่งอื่น ๆ ที่ไม่ดีพอสามารถทำได้หรือไม่ ใช้ sed
  • ต้องการการรวมกันของด้านบน 3 หรือการจัดรูปแบบ printf หรือลูปและสาขาทั่วไป ใช้ awk

+1 ยกเว้นการใช้งานแทนperl awkหากคุณต้องการบางสิ่งที่ซับซ้อนกว่า grep / cut / sed โอกาสที่จะเกิดขึ้นจะไม่เพียงพอและคุณต้องการบางสิ่งที่ "เต็มเปี่ยม"
sds

@sds ทำไมไม่ใช้ python แทน
RetroCode

@RetroCode: python เป็น "วัตถุประสงค์ทั่วไป" มากกว่า Perl; ซับหนึ่งเทียบเท่าอาจจะอีกต่อไปมาก
sds

3
@sds ไม่คุณไม่จำเป็นต้องได้รับการยกเว้นว่าคุณกำลังทำสิ่งอื่นนอกเหนือจากการประมวลผลข้อความ awk นั้นใช้ได้กับการประมวลผลข้อความที่ซับซ้อนกว่า grep / cut / sed และโบนัสก็มาเป็นมาตรฐานในการติดตั้ง UNIX ทั้งหมดซึ่งแตกต่างจาก Perl
เอ็ดมอร์ตัน

10

เมื่อค้นหาเฉพาะสตริงและเรื่องความเร็วคุณควรใช้เกือบทุกgrepครั้ง มันเป็นคำสั่งของขนาดเร็วกว่าawkเมื่อพูดถึงการค้นหาขั้นต้นเท่านั้น

แหล่งที่มาความแตกต่างด้านการทำงานและประสิทธิภาพของโปรแกรมอรรถประโยชน์การแยกวิเคราะห์ sed, awk และ Unix อื่น ๆ

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

1
ขอบคุณสำหรับภาพรวมที่ดีของโปรแกรมเหล่านี้ทั้งหมด มันให้แสงสว่างในความมืด
holasz

1
~ headtilt ~ PHP เปิดอยู่ แต่ Perl ไม่ใช่?
Izkata

@Izkata - ฉันคิดเหมือนกันเมื่อฉันเห็นตารางนี้เมื่อไม่นานมานี้
slm

1
มันไม่ยุติธรรมเลยสำหรับสิ่งอื่น ๆ ที่ grep กำลังค้นหาและพวกมันก็เข้ามาแทนที่
เควิน

1
ตัวเลขเหล่านี้เป็นตัวเลขปลอมอย่างสมบูรณ์ พูดคุยเกี่ยวกับการเปรียบเทียบแอปเปิ้ลและส้ม - มันเหมือนว่าคุณสามารถเพียงหารถใหม่บนเว็บไซต์ใน 5 วินาทีในขณะที่คุณสามารถหารถต่อรองราคาได้รับเงินกู้และการซื้อรถบนเว็บไซต์ B ใน 1 ชั่วโมงเพื่อให้ ดังนั้นไซต์ A นั้นเร็วกว่าไซต์ B. บทความที่คุณอ้างถึงนั้นผิดอย่างสิ้นเชิงเนื่องจากเป็นคำแถลงเกี่ยวกับความเร็วในการดำเนินการสัมพัทธ์ระหว่าง grep, sed และ awk และมันยังบอกว่าawk ... has PCRE matching for regular expressionsสิ่งใดเป็นจริงอย่างสมบูรณ์
Ed Morton

5

ในขณะที่ฉันเห็นด้วยในทางทฤษฎี grepควรจะเร็วกว่าawkในทางปฏิบัติ YMMV นั้นขึ้นอยู่กับการใช้งานที่คุณใช้เป็นอย่างมาก

ที่นี่เปรียบเทียบ grep and awk ของ busybox 1.20.0, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 บน Debian / Linux 7.0 amd64 (พร้อม glibc 2.17) ในโลแคล UTF-8 ในไฟล์ 240MB 2.5M บรรทัดของ อักขระ 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 

ในโลแคล C grep ของ GNU เท่านั้นที่ได้รับการสนับสนุนอย่างมาก mawkได้รับเพิ่มที่สำคัญและกลายเป็นเร็วกว่า

ชุดข้อมูลประเภทของ regexp อาจสร้างความแตกต่างใหญ่ สำหรับ regexps awkควรเปรียบเทียบกับgrep -Eเป็นawk regexps นั้นขยาย REs

สำหรับชุดข้อมูลนี้awkอาจเร็วกว่าgrepระบบที่อิงกับ busybox หรือระบบซึ่งmawkเป็นค่าเริ่มต้นawkและโลแคลเริ่มต้นคือ UTF-8 ตาม (IIRC มันเคยเป็นกรณีใน Ubuntu)


2

สั้น ๆgrepทำสิ่งเดียวกับเครื่องมือ UNIX อื่น ๆ อีกมากมายและนั่นคือการจับคู่บรรทัดกับรูปแบบที่กำหนดและทำได้ดี ในทางกลับกัน,awkเป็นเครื่องมือที่มีความซับซ้อนมากขึ้นเนื่องจากเป็นภาษาการเขียนโปรแกรมที่สมบูรณ์ที่กำหนดโดยมาตรฐาน POSIX พร้อมคุณสมบัติทั่วไปเช่นตัวแปร, อาร์เรย์, การแสดงออก, ฟังก์ชั่นหรือคำสั่งควบคุมสำหรับการสแกนและการประมวลผลแบบ

ในความคิดของฉันมันขึ้นอยู่กับการใช้งานว่าเครื่องมือทั้งสองทำงานอย่างไรในกรณีของการจับคู่รูปแบบและขนาดของอินพุตที่คุณต้องการประมวลผล ฉันคาดหวังว่า grep มักจะมีประสิทธิภาพมากกว่า awk เพราะมันจับคู่เท่านั้น แต่คุณไม่สามารถเขียนด้วยรหัสง่าย ๆ เพื่อดำเนินงานที่ซับซ้อนมากขึ้นเช่นการประมวลผลของระเบียนที่ตรงกันเพิ่มเติมการคำนวณหรือผลการพิมพ์โดยไม่ต้องใช้เครื่องมืออื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.