ควรใช้ grep, less, awk, sed เมื่อไหร่


17

ฉันเข้าสู่โลกของ Linux และที่ทำงานฉันใช้grepมากขึ้นเรื่อย ๆ ด้วยการทำเช่นนั้นฉันก็พบว่าบางครั้งมันก็ไม่เพียงพอสำหรับสิ่งที่ฉันต้องการ

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

ดังนั้นคำถามของฉันคือเมื่อไหร่ที่คุณเลือกที่จะใช้อีกอันหนึ่ง? คำถามอะไรที่ฉันสามารถถามตัวเองก่อนที่จะทำงานด้วยgrepและใช้เวลามากเมื่อฉันสามารถทำได้ด้วยawkและประหยัดเวลา?


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

7
ใช้lessเพื่อดูไฟล์ ใช้grepเพื่อค้นหาไฟล์ ใช้sedเพื่อแก้ไขไฟล์ ใช้awkซ้ำgrepและsedเมื่อไฟล์ที่คุณต้องการประมวลผลมีโครงสร้างบางอย่าง(เช่นคอลัมน์) ใช้sedมากกว่าawkเมื่อคุณส่วนใหญ่ต้องการที่จะจัดการกับสาย (เช่นสายการลบหรือเพิ่มข้อความ) ฉันแน่ใจว่าบางคนจะเขียนคำตอบ 20 หน้าซึ่งสมบูรณ์กว่าของฉัน
Satō Katsura

สวัสดี Sato มันไม่ได้เกี่ยวกับความยาว แต่สิ่งที่พูด และคุณไม่กี่บรรทัดมีข้อมูลมาก ขอขอบคุณ.
frankguthrie

คำตอบ:


25

sedและawkเป็น supersets grepมีสิ่งที่ง่ายต่อการทำอย่างใดอย่างหนึ่ง

grep fooสามารถเขียนsed '/foo/!d'หรือawk /foo/พิจารณา แต่:

grep -i fooจะต้องมีsed '/[fF][oO][oO]/!d'ถ้าคุณต้องการที่จะต้องพิจารณาส่วนขยายที่ไม่ได้มาตรฐานเช่น sed '/foo/I!d'GNU หรือกับawk: awk 'tolower($0) ~ /foo/'หรืออีกครั้งโดยใช้ส่วนขยายของ awk -v IGNORECASE=1 /foo/GNU:

สิ่งต่าง ๆ เครื่องมือต่าง ๆ ดีและยุ่งยากกับเครื่องมืออื่น ๆ :

grep

grepเป็นเครื่องมือง่าย ๆ แต่มีโหมดการทำงานเฉพาะทางที่ยากต่อการทำซ้ำด้วยawkหรือsed:

  • grep -i สำหรับการจับคู่แบบตัวเล็กและตัวเล็ก (ดูด้านบน)
  • grep -Fe "$string"สำหรับการค้นหาสตริงคงที่ ( export string; awk 'index($0, ENVIRON["string"])'กับawk, ไม่เทียบเท่าโดยตรงกับsed)
  • (ไม่ใช่มาตรฐาน) grep -rสำหรับการค้นหาแบบเรียกซ้ำ
  • (ไม่ใช่แบบมาตรฐาน) grep -P/ pcregrepสำหรับ regexps แบบ perl ( sedการใช้งานบางอย่างมีการสนับสนุน regexp แบบ perl เหมือน แต่ไม่ใช่แบบที่สำคัญที่สุด)
  • (ไม่ใช่มาตรฐาน) grep -oเพื่อส่งคืนส่วนที่จับคู่ (หลายบรรทัดawkหรือsedเพื่อทำเช่นเดียวกัน)
  • (ไม่ใช่มาตรฐาน) grep -A/B/Cเพื่อกลับบริบทรอบการแข่งขัน (เจ็บปวดอีกครั้งในการทำแบบเดียวกันกับsedหรือawk)

sed

  • s/foo/bar/: sed's sคำสั่งมีคุณสมบัติที่ยากที่จะดำเนินการในawkที่ชอบ:
  • s/foo\(.*\)bar/\1/g: การจับภาพ (แม้ว่า GNU awk มีgensub()ส่วนขยายสำหรับสิ่งนั้น)
  • s/foo/bar/3: แทนที่เหตุการณ์ที่ 3 ในแต่ละบรรทัด
  • (ไม่ใช่แบบมาตรฐาน): การแก้ไขไฟล์แบบแทนที่ (แม้ว่า GNU จะรองรับawkแล้วในตอนนี้)

awk

awk เป็นคุณลักษณะที่รวยที่สุดในสาม

  • ดีสำหรับการจัดการกับตัวเลข
  • เหมาะสำหรับจัดการกับอินพุตที่จัดรูปแบบในคอลัมน์
  • เหมาะสำหรับการแยกและรวมข้อมูลจากแหล่งต่าง ๆ พร้อมอาเรย์แบบเชื่อมโยง

Perl

perlในฐานะที่เป็นเครื่องมือสกัดและรายงานที่ใช้งานได้จริงมีประโยชน์ที่สุด นั่นคือสิ่งที่มันถูกออกแบบมาในตอนแรกสำหรับ (เป็นเครื่องมือที่ทำให้sed/ awkล้าสมัยทั้งหมด)

การเรียนรู้ที่perlจะทำการประมวลผลข้อความจะให้ประโยชน์อย่างจริงจัง ฉันขอแนะนำให้ใช้เวลากับมันแม้กระทั่งก่อนที่จะดูsedคำสั่งทั่วไปที่น้อยกว่าเช่น

ประสิทธิภาพ

ตามกฎของหัวแม่มือเครื่องมือพิเศษที่มีประสิทธิภาพมากที่สุดคือที่งาน แต่นั่นก็ขึ้นอยู่กับการนำไปปฏิบัติงานและปัจจัยอื่น ๆ อีกหลายอย่างและประสิทธิภาพอาจมีการแลกเปลี่ยนที่อาจต้องพิจารณา

ตัวอย่างเช่นมีบางส่วนgrepหรือsedการนำไปใช้งานที่รวดเร็วมาก แต่สำหรับอินสแตนซ์เหล่านี้ไม่สนับสนุนอักขระหลายไบต์ดังนั้นสามารถทำงานได้อย่างถูกต้องกับข้อความภาษาอังกฤษสหรัฐอเมริกาในโลแคลหลายไบต์ หรือพวกมันเร็วเพราะมันทำงานบนบัฟเฟอร์ที่มีความยาวคงที่และไม่สามารถทำงานกับอินพุตโดยพลการ ...


คำตอบที่ยอดเยี่ยม! คุณรู้เกี่ยวกับประสิทธิภาพของเครื่องมือหรือไม่? ฉันสับสนเกี่ยวกับคำสั่งของ OP ที่awkเร็วกว่าgrepมาก
pfnuesel

@pfnuesel นั้นขึ้นอยู่กับการนำไปใช้และรูปแบบการใช้งานเป็นอย่างมาก ยกตัวอย่างเช่นmawkเป็นที่รู้จักกันดีว่ามีประสิทธิภาพมาก (แต่ไม่รองรับอักขระหลายไบต์ซึ่งเป็นส่วนหนึ่งของเหตุผลที่มีประสิทธิภาพมากกว่าเครื่องมืออื่น ๆ )
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.