แค่อยากรู้ว่าอะไรคือความแตกต่างที่สำคัญระหว่างพวกเขา และพลังของแต่ละภาษา (ซึ่งจะดีกว่าการใช้งาน)
แก้ไข:ไม่ใช่ "vs. " ชอบหัวข้อเพียงแค่ข้อมูล
แค่อยากรู้ว่าอะไรคือความแตกต่างที่สำคัญระหว่างพวกเขา และพลังของแต่ละภาษา (ซึ่งจะดีกว่าการใช้งาน)
แก้ไข:ไม่ใช่ "vs. " ชอบหัวข้อเพียงแค่ข้อมูล
คำตอบ:
ในลำดับการแสดงภาษาที่มีsed
, awk
, ,perl
python
sed
โปรแกรมเป็นบรรณาธิการกระแสและถูกออกแบบมาเพื่อใช้การดำเนินการจากสคริปต์เพื่อแต่ละบรรทัด (หรือมากกว่าปกติช่วงที่ระบุของสาย) ของแฟ้มข้อมูลหรือไฟล์ ภาษามีพื้นฐานมาจากed
ตัวแก้ไข Unix และแม้ว่าจะมีเงื่อนไขและอื่น ๆ แต่ก็ยากที่จะทำงานกับงานที่ซับซ้อนได้ คุณสามารถทำงานปาฏิหาริย์เล็กน้อยกับมันได้ แต่เสียค่าใช้จ่ายกับผมบนหัวของคุณ อย่างไรก็ตามอาจเป็นโปรแกรมที่เร็วที่สุดเมื่อพยายามทำงานภายในการส่งเงิน (มันมีการแสดงออกปกติน้อยที่สุดที่มีประสิทธิภาพของโปรแกรมที่กล่าวถึง - เพียงพอสำหรับวัตถุประสงค์หลายอย่าง แต่ไม่แน่นอน PCRE - การแสดงออกปกติที่เข้ากันได้กับ Perl)
awk
โปรแกรม (ชื่อจากชื่อย่อของผู้เขียนของ - Aho ไวน์เบอร์เกอร์และ Kernighan) เป็นเครื่องมือในการจัดรูปแบบครั้งแรกสำหรับรายงาน มันสามารถใช้เป็น souped-up sed
; ในเวอร์ชันที่ใหม่กว่านั้นจะเสร็จสมบูรณ์โดยใช้คอมพิวเตอร์ มันใช้ความคิดที่น่าสนใจ - โปรแกรมนี้ใช้ 'รูปแบบการจับคู่' และ 'การดำเนินการเมื่อรูปแบบตรงกัน' รูปแบบมีประสิทธิภาพพอสมควร (Extended Regular Expressions) ภาษาสำหรับการดำเนินการคล้ายกับ C. หนึ่งในคุณสมบัติที่สำคัญของawk
มันคือมันแยกอินพุตโดยอัตโนมัติเป็นบันทึกและแต่ละบันทึกลงในช่อง
Perl เขียนขึ้นในส่วนของ awk-killer และ sed-killer สองโปรแกรมที่มีให้คือa2p
และs2p
สำหรับการแปลงawk
สคริปต์และsed
สคริปต์เป็น Perl Perl เป็นหนึ่งในภาษาสคริปต์รุ่นต่อไป (Tcl / Tk อาจเรียกร้องอันดับหนึ่ง) มันมีการจัดการการแสดงออกปกติที่มีประสิทธิภาพรวมกับภาษาที่ทรงพลังมากขึ้น มันให้การเข้าถึงการโทรของระบบเกือบทั้งหมดและมีความสามารถในการขยายของโมดูล CPAN (ทั้งawk
มิได้sed
ขยาย.) หนึ่งในคำขวัญของ Perl คือ "TMTOWTDI - มีมากกว่าหนึ่งวิธีที่จะทำมัน" (ออกเสียงว่า "ทิมช่างประจบ") Perl มี 'วัตถุ' แต่มันเป็นส่วนเสริมมากกว่าส่วนพื้นฐานของภาษา
Python เขียนขึ้นครั้งสุดท้ายและอาจเป็นส่วนหนึ่งในการตอบสนองต่อ Perl มันมีแนวคิดเกี่ยวกับวากยสัมพันธ์ที่น่าสนใจ (เยื้องเพื่อระบุระดับ - ไม่มีวงเล็บปีกกาหรือสิ่งเทียบเท่า) มันเป็นวัตถุเชิงพื้นฐานมากกว่า Perl; มันสามารถขยายได้เหมือนกับ Perl
ตกลง - ใช้เมื่อใด?
ฉันไม่ได้ตระหนักถึงสิ่งที่ Perl สามารถทำสิ่งที่งูหลามไม่สามารถหรือในทางกลับกัน ตัวเลือกระหว่างทั้งสองจะขึ้นอยู่กับปัจจัยอื่น ๆ ฉันเรียน Perl ก่อนที่จะมี Python ดังนั้นฉันมักจะใช้มัน Python มีไวยากรณ์ที่ใช้น้อยกว่าและโดยทั่วไปแล้วค่อนข้างง่ายต่อการเรียนรู้ Perl 6 เมื่อมันพร้อมใช้งานจะเป็นการพัฒนาที่น่าสนใจ
(โปรดทราบว่าโดยเฉพาะอย่างยิ่ง 'ภาพรวม' ของ Perl และ Python โดยเฉพาะจะไม่สมบูรณ์อย่างมาก; หนังสือทั้งเล่มสามารถเขียนในหัวข้อ)
awk
มากกว่าsed
สำหรับการเรียนรู้ (แม้ว่าทั้งสองยังคงมีประโยชน์) สำหรับขนาดของงาน: sed
มันดีที่สุดเมื่อมันประมวลผลทีละบรรทัดโดยไม่มีที่เก็บข้อมูลจากบรรทัดหนึ่งไปอีกบรรทัด awk
มักจะใช้เพื่อสร้างอาร์เรย์เชื่อมโยงกับข้อมูลที่สะสมจากแหล่งที่มาทั้งหมด มันใช้หน่วยความจำมากขึ้นและมีแนวโน้มที่จะเกิดปัญหากับชุดข้อมูลขนาดใหญ่มากกว่าที่sed
เป็นอยู่ ฉันไม่เคยได้ยินมาtsawk
ก่อนที่คุณจะเชื่อมโยงกับมัน ฉันมักจะถอยกลับใน Perl ( แต่คุณอาจจะทำอย่างไรดีกับงูใหญ่) awk
เมื่องานมากเกินไปสำหรับ
หลังจากเชี่ยวชาญภาษาไม่กี่โหลคุณจะเบื่อหน่ายกับคนอย่างเอสล็อตต์ (ดูคำตอบที่ขัดแย้งกับคำถามนี้เกือบครึ่งหนึ่งโหวตลงมากที่สุด (+45 / -22) หกปีหลังจากตอบ)
Sed เป็นเครื่องมือที่ดีที่สุดสำหรับไพพ์ไลน์บรรทัดคำสั่งที่แสนง่าย อยู่ในมือของผู้ชำนาญการมันเหมาะสำหรับการสลับซับซ้อนเพียงครั้งเดียว แต่ไม่ควรใช้ในรหัสการผลิตยกเว้นในการวางท่อทดแทนที่ง่ายมาก สิ่งต่างๆเช่น 's / this / that /.'
Gawk (GNU awk) เป็นทางเลือกที่ดีที่สุดสำหรับการจัดรูปแบบข้อมูลที่ซับซ้อนเมื่อมีแหล่งอินพุตเพียงแหล่งเดียวและเอาต์พุตเดี่ยว (หรือหลายเอาต์พุตที่เขียนตามลำดับ) เนื่องจากการทำงานในโลกแห่งความเป็นจริงนั้นสอดคล้องกับคำอธิบายนี้และโปรแกรมเมอร์ที่ดีสามารถเรียนรู้การเพ่งเล็งในสองชั่วโมงจึงเป็นทางเลือกที่ดีที่สุด บนโลกใบนี้ง่ายและเร็วกว่าดีกว่า!
Perl หรือ Python ดีกว่ารุ่น awk หรือ sed ใด ๆ เมื่อคุณมีสถานการณ์อินพุต / เอาท์พุตที่ซับซ้อนมาก ปัญหาที่ซับซ้อนมากขึ้นคือยิ่งคุณใช้ไพ ธ อนมากเท่าไรคุณก็ยิ่งมีจุดยืนในการบำรุงรักษาและความสามารถในการอ่านที่ดีขึ้น อย่างไรก็ตามโปรดทราบว่าโปรแกรมเมอร์ที่ดีสามารถเขียนโค้ดที่อ่านได้ในภาษาใด ๆ และโปรแกรมเมอร์ที่ไม่ดีสามารถเขียนอึที่ไม่มีประโยชน์ในภาษาที่มีประโยชน์ใด ๆ ดังนั้นการเลือก perl หรือ python จะถูกทิ้งไว้อย่างปลอดภัยต่อการตั้งค่าของโปรแกรมเมอร์ มีฝีมือและฉลาด
a?ⁿaⁿ
เป็นa??ⁿaⁿ
เรียกใช้ใน Perl 5 ด้วยⁿ
1,000,000 มันจะทำงานในเวลาน้อยกว่าสองวินาที time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'
หากคุณเรียกใช้คนที่ไร้เดียงสาจะใช้เวลามากกว่าสองวินาทีในเวลาⁿ
เพียง 25 วินาทีสิ่งที่คุณต้องรู้คือ Perl มีคุณสมบัติ regex มากกว่าที่เร็วกว่ารวมถึงการอนุญาตให้คุณมีรหัส Perl ภายใน regex ที่เปลี่ยนแปลงสิ่งที่มันตรงกับ . คุณสามารถใช้โมดูลที่แลกเปลี่ยนบิวด์อินสำหรับหนึ่งในโมดูลเหล่านั้นหากคุณต้องการ
ฉันจะไม่เรียกว่าภาษาโปรแกรมที่เต็มเปี่ยมมันเป็นตัวแก้ไขสตรีมที่มีภาษาที่สร้างขึ้นเพื่อแก้ไขไฟล์ข้อความโดยทางโปรแกรม
Awk เป็นภาษาวัตถุประสงค์ทั่วไปมากกว่าเล็กน้อย แต่ก็ยังเหมาะสมที่สุดสำหรับการประมวลผลข้อความ
Perl และ Python เป็นภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปอย่างสมบูรณ์ Perl มีรากฐานในการประมวลผลข้อความและมีโครงสร้างคล้าย awk (มีแม้กระทั่งสคริปต์ awk-to-perl ที่ลอยอยู่บนเน็ต) มีความแตกต่างมากมายระหว่าง Perl และ Python ทางออกที่ดีที่สุดของคุณคือการอ่านบทสรุปของทั้งสองภาษาในบางสิ่งเช่น Wikipedia เพื่อทำความเข้าใจกับสิ่งที่พวกเขาเป็น
อันดับแรกมีสองสิ่งที่ไม่เกี่ยวข้องในรายการ "Perl, Python awk และ sed"
สิ่งที่ 1 - เครื่องมือจัดการข้อความอย่างง่าย
sed มันมีขอบเขตงานที่ค่อนข้างคงที่ค่อนข้างเรียบง่ายที่กำหนดโดยแนวคิดของการอ่านและตรวจสอบแต่ละบรรทัดของไฟล์ sed ไม่ได้ถูกออกแบบมาให้อ่านได้โดยเฉพาะ มันถูกออกแบบมาให้มีขนาดเล็กมากและมีประสิทธิภาพมากในเซิร์ฟเวอร์ยูนิกซ์ขนาดเล็กมาก
awk มันมีขอบเขตการแก้ไขที่น้อยกว่าเล็กน้อยและเรียบง่ายน้อยกว่า อย่างไรก็ตามการวนลูปหลักของโปรแกรม awk นั้นถูกกำหนดโดยการอ่านบรรทัดของซอร์สไฟล์โดยปริยาย
ภาษาการเขียนโปรแกรมเหล่านี้ไม่สมบูรณ์ ในขณะที่คุณสามารถ - กับงาน - เขียนโปรแกรมที่ค่อนข้างซับซ้อนใน awk มันจะซับซ้อนและอ่านยาก
สิ่งที่ 2 - ภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป สิ่งเหล่านี้มีชนิดของคำสั่งที่หลากหลายมากมายโครงสร้างข้อมูลในตัวจำนวนมากและไม่มีการตั้งสมมติฐานหรือทางลัดแบบมีสายในการพูด
Perl
หลาม
ควรใช้เมื่อใด
sed ไม่เคย มันไม่มีคุณค่าใด ๆ ในยุคคอมพิวเตอร์สมัยใหม่ที่มีหน่วยความจำมากกว่า 32K Perl หรือ Python ทำสิ่งเดียวกันชัดเจนยิ่งขึ้น
awk ไม่เคย มันสะท้อนถึงยุคสมัยก่อนหน้าของการคำนวณ แทนที่จะรักษาภาษานี้ (นอกเหนือจากภาษาอื่น ๆ ทั้งหมดที่จำเป็นสำหรับระบบที่ประสบความสำเร็จ) มันดีกว่าที่จะทำทุกอย่างด้วยภาษาที่น่าพอใจเพียงอย่างเดียว
Perl ปัญหาการเขียนโปรแกรมใด ๆ ถ้าคุณชอบซินแท็กซ์อิสระที่มีหลายวิธีในการทำสิ่งเดียวกัน Perl คือความสนุก
หลาม ปัญหาการเขียนโปรแกรมใด ๆ ถ้าคุณชอบไวยากรณ์ที่ค่อนข้าง จำกัด ซึ่งมีตัวเลือกน้อยกว่าความละเอียดน้อยกว่าและ (อาจ) ชัดเจนยิ่งขึ้น ลักษณะเชิงวัตถุของ Python ทำให้เหมาะสำหรับปัญหาที่มีขนาดใหญ่และซับซ้อน
ความเป็นมา - ฉันไม่ได้ทุบตีและตื่นตัวโดยไม่รู้ตัว ฉันเรียนรู้ awk กว่า 20 ปีที่แล้ว ทำสิ่งต่าง ๆ กับมัน; เคยสอนมันเป็นความสามารถหลักของยูนิกซ์ ฉันเรียน Perl เมื่อ 15 ปีที่แล้ว ทำสิ่งที่ซับซ้อนมากมายกับมัน ฉันทิ้งทั้งคู่ไว้เพราะฉันสามารถทำสิ่งเดียวกันใน Python ได้และมันก็ง่ายขึ้นและชัดเจนขึ้น
มีสองปัญหาร้ายแรงกับ sed และ awk ซึ่งไม่ได้อายุของพวกเขา
ความไม่สมบูรณ์ของการนำไปใช้ ทุกอย่างที่ต้องทำและตื่นตกใจสามารถทำได้ใน Python หรือ Perl ซึ่งบ่อยครั้งจะง่ายและเร็วขึ้นเช่นกัน ไปป์ไลน์เชลล์มีข้อได้เปรียบด้านประสิทธิภาพเนื่องจากการประมวลผลแบบมัลติ Python นำเสนอsubprocess
โมดูลเพื่อให้ฉันสามารถกู้คืนข้อดีเหล่านั้นได้
จำเป็นต้องเรียนรู้ภาษาอื่น การทำสิ่งต่าง ๆ ใน Python (หรือ Perl) การใช้งานของคุณขึ้นอยู่กับภาษาที่น้อยลงพร้อมกับเพิ่มความชัดเจน
ควรใช้เมื่อใด: awk - never - S. Lott
ฉันคิดว่า S. Lott พลาดเครื่องหมายเล็กน้อยด้วยคำแนะนำนี้ ความจริงคือบน Linux และสภาพแวดล้อม UNIX อื่น ๆ awk เป็นเครื่องมือที่มีประโยชน์ที่จะใช้กับ bash, sh และ ksh สำหรับการประมวลผลข้อความอย่างรวดเร็ว แนวคิดของการเขียนสคริปต์ตัวเองคือคุณแก้ปัญหาของคุณโดยการรวมเครื่องมือนี้เข้าด้วยกันซึ่งเป็นเครื่องมือ ดังนั้นในสคริปต์ของผู้ดูแลระบบจึงเป็นเรื่องปกติที่จะมี ls, grep, |, awk, เวลา, ps และอื่น ๆ แต่ละรายการเป็นเครื่องมือที่ scripter รวมกันเหมือนตัวสร้างอิฐด้วยอิฐเพื่อสร้างอาคารให้เสร็จ (เพื่อแก้ปัญหาในมือ) .
ตัวอย่างเช่นฉันเป็นสมาชิกในทีมของทีมที่จัดการอุปกรณ์เพนท์บอลดอทคอม ไซต์อีคอมเมิร์ซนี้ใช้ LAMP stack สำหรับการประมวลผลอัตโนมัติและการปรับมาตรฐานฟีดข้อมูลจากซัพพลายเออร์หลายรายให้เป็นฐานข้อมูลแบ็คเอนด์เราใช้และบำรุงรักษาสคริปต์ที่หลากหลายรวมถึง bash, perl, php และแม้แต่คาดหวัง แต่ละจุดมีจุดแข็งตามโมดูลและ API ที่มีอยู่ ในสคริปต์ทุบตีเราทำการจับคู่รูปแบบด่วนและการกระทำที่เหมาะสมกับรูปแบบตามต้องการโดยใช้ awk โดยไม่จำเป็นต้องเปลี่ยนเป็น PERL สิ่งหนึ่งที่ฉันอยากจะชี้ให้เห็นซึ่งยังไม่ได้รับการเน้นในหัวข้อคือจำนวนสคริปต์ที่ถูกซื้อมาเหล่านี้หรือมาจากโอเพนซอร์ส หากสคริปต์มาเป็น Perl เราจะคงไว้เป็น Perl หากสคริปต์มาเป็น Php เราจะคงไว้เหมือน Php ถ้ามันมาเป็นทุบตีเราคงไว้ว่าเป็นทุบตี;
ls
ให้ใช้ glob แทน อ่านนี่.