ความแตกต่างระหว่าง sed และ awk คืออะไร? [ปิด]


497
  • อะไรคือความแตกต่างระหว่าง awk และ sed?
  • แอปพลิเคชั่นประเภทใดบ้างที่ใช้ดีที่สุดสำหรับเครื่องมือ sed และ awk


คำตอบ:


549

sedเป็นตัวแก้ไขสตรีม มันทำงานร่วมกับกระแสของตัวละครในแต่ละบรรทัด มันมีภาษาการเขียนโปรแกรมดั้งเดิมที่มีการวนรอบแบบ goto และเงื่อนไขแบบง่าย (นอกเหนือจากการจับคู่รูปแบบและการจับคู่ที่อยู่) โดยพื้นฐานแล้วมีเพียง "ตัวแปร" สองตัวเท่านั้น: พื้นที่รูปแบบและพื้นที่พัก การอ่านสคริปต์ได้ยาก การดำเนินการทางคณิตศาสตร์เป็นสิ่งที่ผิดปกติอย่างมาก

มีหลายรุ่นsedพร้อมระดับการสนับสนุนที่แตกต่างกันสำหรับตัวเลือกบรรทัดคำสั่งและคุณสมบัติภาษา

awkถูกวางแนวไปยังเขตข้อมูลที่คั่นด้วยพื้นฐานต่อบรรทัด มันมีประสิทธิภาพมากขึ้นรวมถึงการเขียนโปรแกรมโครงสร้างif/ else, while, do/ whileและfor(C สไตล์และซ้ำอาร์เรย์) มีการสนับสนุนที่สมบูรณ์สำหรับตัวแปรและอาร์เรย์แบบเชื่อมโยงมิติเดียวบวก (IMO) kludgey หลายมิติอาร์เรย์ การดำเนินการทางคณิตศาสตร์คล้ายกับใน C มันมีprintfและฟังก์ชั่น "K" ใน "AWK" ย่อมาจาก " K ernighan" ในขณะที่ "Kernighan และ Ritchie" ของหนังสือ "C Programming Language" มีชื่อเสียง (ไม่ลืมA Ho และW einberger) awkหนึ่งกลัวจะเขียนเครื่องตรวจจับการขโมยความคิดของนักวิชาการโดยใช้

GNU awk( gawk) มีส่วนขยายจำนวนมากรวมถึงอาร์เรย์หลายมิติที่แท้จริงในรุ่นล่าสุด มีรูปแบบอื่น ๆ ของการอยู่awkรวมและmawknawk

โปรแกรมทั้งสองใช้นิพจน์ทั่วไปสำหรับการเลือกและประมวลผลข้อความ

ฉันมักจะใช้sedที่มีรูปแบบในข้อความ ตัวอย่างเช่นคุณสามารถแทนที่ตัวเลขลบทั้งหมดในข้อความบางข้อความที่อยู่ในรูปแบบ "เครื่องหมายลบแล้วตามด้วยตัวเลข" (เช่น "-231.45") ด้วยรูปแบบ "วงเล็บของนักบัญชี" (เช่น 231.45) ) ใช้สิ่งนี้ (ซึ่งมีห้องสำหรับการปรับปรุง):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile

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

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile

แน่นอนว่านี่เป็นเพียงตัวอย่างง่ายๆที่ไม่ได้แสดงให้เห็นถึงความสามารถที่หลากหลายที่แต่ละคนมีให้


7
หากต้องการดูตัวอย่างของการผลักขอบเขตsed: sed.sourceforge.net/#scripts
หยุดชั่วคราวจนกว่าจะมีประกาศ

@DennisWilliamson - ฉันมีข้อเสียถ้าฉันเรียนรู้ awk เท่านั้น? awk ใช้กันอย่างแพร่หลายมากกว่า sed หรือไม่?
Steam

4
@blasto: คำแนะนำของฉันคือการเรียนรู้ทั้งสองอย่าง แต่ให้ความสำคัญกับ awk มากขึ้น สิ่งที่แสดงออกปกติจำนวนมากนำไปใช้กับทั้ง (และเครื่องมือและภาษาอื่น ๆ ) ใช้สิ่งที่ง่ายกว่าและพยายามหลีกเลี่ยงสิ่งที่ซับซ้อน มันยอดเยี่ยมจริงๆที่คุณสามารถทำลูปและกิ่งก้านได้ใน sed แต่บรรทัดคำสั่งที่ได้นั้นซับซ้อนและอ่านยาก คำตอบสำหรับคำถามของคุณขึ้นอยู่กับสิ่งที่คุณทำ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@DennisWilliamson - อะไรจะเป็นประโยชน์กับนักพัฒนา ETL มากที่สุด? ETL หรือแยกการแปลงและโหลดเป็นคำศัพท์คลังข้อมูล งานที่เกี่ยวข้องกับการสกัดข้อมูลจากแหล่งข้อมูลที่แตกต่างกัน (เช่นฐานข้อมูล, ไฟล์ excel, ไฟล์ csv ฯลฯ ), การแปลงรูปแบบเดียวกันแล้วโหลดลงในคลังข้อมูล (DW) สำหรับการวิเคราะห์, การหารูปแบบข้อมูลหรือข้อมูลเชิงประวัติ บันทึก เช่น. การใช้งานขั้นตอนสุดท้ายของ DW - อัลกอริทึมที่นำไปใช้กับ DW ของร้านขายของชำที่มีข้อมูลจาก 10 ปีที่ผ่านมาอาจเปิดเผยว่าคนที่มีแนวโน้มที่จะซื้อแอปเปิ้ลก็ซื้อส้มหรือสิ่งที่คล้ายกัน
Steam

1
เป็นเพียง FYI สำหรับทุกคนที่เจอสิ่งนี้ในเครื่อง mac ลอง "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" สำหรับตัวอย่างแรก
Daniel Schmidt

124

1) อะไรคือความแตกต่างระหว่าง awk และ sed?

ทั้งสองเป็นเครื่องมือที่แปลงข้อความ แต่ awk สามารถทำสิ่งต่าง ๆ ได้มากกว่าเพียงแค่จัดการข้อความ มันเป็นภาษาการเขียนโปรแกรมด้วยตัวเองโดยส่วนใหญ่ของสิ่งที่คุณเรียนรู้ในการเขียนโปรแกรมเช่นอาร์เรย์ลูปถ้า / อื่น ๆ การควบคุมการไหล ฯลฯ คุณสามารถ "โปรแกรม" ใน sed เช่นกัน แต่คุณไม่ต้องการที่จะรักษารหัสเขียนไว้ .

2) ชนิดของแอปพลิเคชันประเภทใดบ้างที่เหมาะกับกรณีที่ใช้กับเครื่องมือ sed และ awk

สรุป: ใช้ sed สำหรับการแยกวิเคราะห์ข้อความที่ง่ายมาก อะไรนอกเหนือจากนั้น awk จะดีกว่า ในความเป็นจริงคุณสามารถขุดคูด้วยกันและใช้ awk เนื่องจากฟังก์ชั่นของพวกเขาซ้อนทับและ awk สามารถทำได้มากกว่าเพียงแค่ใช้ awk คุณจะลดช่วงการเรียนรู้ของคุณเช่นกัน


7
จุดดีเกี่ยวกับเส้นโค้งการเรียนรู้ .. เครื่องมือมากเกินไปสามารถมิกซ์ .. ดังนั้นฉันจึงชอบการเรียนรู้ grep และ awk เท่านั้น .. ให้ลืมเรื่อง sed :)
Outlier

174
^^ พอแล้ว (ขออภัยฉันต้อง)
Greg M. Krsak

8
ฉันพบว่า sed นั้นง่ายต่อการเรียนรู้มากดังนั้นคุณต้องคำนึงถึงสิ่งนั้น ในขณะที่คุณเรียนรู้ที่จะเรียนรู้ awk มันอาจจะเป็นประโยชน์ในการเรียนรู้อย่างรวดเร็วเพื่อให้สามารถใช้งานได้เร็วขึ้นสำหรับสิ่งที่คุณอาจไม่รู้ว่าต้องทำอย่างไรใน awk
Didier A.

1
@ GregKrsak คุณทำวันของฉัน (ขออภัยฉันต้อง)
Abel Callejo

15
อย่าทิ้งsed, 's/search/replace'เป็นวิธีที่ง่ายในการพิมพ์มากกว่าawk's ไวยากรณ์และเป็นสิ่งที่คุณต้องการมากที่สุดของเวลา
sjas

54

เครื่องมือทั้งสองมีไว้เพื่อทำงานกับข้อความและมีงานที่สามารถใช้ทั้งสองเครื่องมือได้

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

grepนอกจากนี้คุณไม่ควรลืมเกี่ยวกับ ใช้grepหากคุณต้องการค้นหา / แยกบางอย่างในข้อความ (ไฟล์)

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