2008-12-14 19 views
216

chỉ muốn biết sự khác biệt chính giữa chúng là gì? và sức mạnh của từng ngôn ngữ (nơi sử dụng nó tốt hơn).Sự khác nhau giữa Perl, Python, AWK và sed là gì?

Chỉnh sửa: không phải là "so với" như chủ đề, chỉ là thông tin.

+108

Những loại câu hỏi được gọi là không mang tính xây dựng này thực sự hữu ích. – Steam

+5

Chắc chắn, một tab trên trang đầu để tìm thấy chúng sẽ có ích ... – nus

+0

Để biết tính hữu ích của python trên dòng lệnh, xem pyp –

Trả lời

477

Để xuất hiện, các ngôn ngữ là sed, awk, perl, python.

Chương trình sed là trình chỉnh sửa luồng và được thiết kế để áp dụng các hành động từ tập lệnh cho mỗi dòng (hoặc, nói chung, với phạm vi dòng được chỉ định) của tệp hoặc tệp đầu vào. Ngôn ngữ của nó dựa trên ed, trình soạn thảo Unix, và mặc dù nó có điều kiện và vân vân, rất khó để làm việc với các nhiệm vụ phức tạp. Bạn có thể làm phép lạ nhỏ với nó - nhưng với chi phí cho tóc trên đầu bạn. Tuy nhiên, nó có lẽ là nhanh nhất của các chương trình khi cố gắng thực hiện nhiệm vụ trong quá trình chuyển. (Nó có các biểu thức chính quy mạnh nhất của các chương trình được thảo luận - đầy đủ cho nhiều mục đích, nhưng chắc chắn không phải PCRE - Biểu thức chính quy tương thích Perl)

Chương trình awk (tên từ chữ viết tắt của tác giả - Aho, Weinberger và Kernighan)) là một công cụ ban đầu để định dạng báo cáo. Nó có thể được sử dụng như là một canh lên sed; trong các phiên bản gần đây hơn, nó hoàn toàn được tính toán. Nó sử dụng một ý tưởng thú vị - chương trình dựa trên 'các mẫu phù hợp' và 'các hành động được thực hiện khi mẫu phù hợp'. Các mẫu khá mạnh (Biểu thức chính quy mở rộng). Ngôn ngữ cho các hành động tương tự như C. Một trong những tính năng chính của awk là nó chia tách các dòng nhập vào các trường tự động.

Perl được viết một phần là kẻ giết người và kẻ giết người. Hai trong số các chương trình được cung cấp với nó là a2ps2p để chuyển đổi các tập lệnh awksed tập lệnh thành Perl. Perl là một trong những sớm nhất của thế hệ tiếp theo của ngôn ngữ kịch bản (Tcl/Tk có thể có thể tuyên bố ưu tiên). Nó có xử lý biểu thức chính quy tích hợp mạnh mẽ với một ngôn ngữ mạnh mẽ hơn bao la. Nó cung cấp quyền truy cập vào hầu hết tất cả các cuộc gọi hệ thống và có khả năng mở rộng của các mô-đun CPAN. (Không phải là awk cũng không phải sed là có thể mở rộng.) Một trong những mottos của Perl là "TMTOWTDI - Có nhiều cách để làm điều đó" (phát âm là "tim-toady"). Perl có 'đối tượng', nhưng nó là một phần bổ sung hơn là một phần cơ bản của ngôn ngữ.

Python được viết cuối cùng và có lẽ một phần là phản ứng với Perl. Nó có một số ý tưởng cú pháp thú vị (thụt lề để chỉ ra các mức - không có niềng răng hoặc tương đương). Nó cơ bản hướng đối tượng hơn Perl; nó chỉ có thể mở rộng như Perl.

OK - khi nào nên sử dụng?

  • sed - khi bạn cần thực hiện biến đổi văn bản đơn giản trên tệp.
  • awk - khi bạn chỉ cần định dạng và tóm tắt hoặc chuyển đổi dữ liệu đơn giản.
  • perl - cho hầu hết mọi tác vụ, nhưng đặc biệt khi tác vụ cần biểu thức chính quy phức tạp.
  • python - cho cùng một tác vụ mà bạn có thể sử dụng Perl cho.

Tôi không biết bất cứ điều gì mà Perl có thể làm điều đó Python không thể, cũng không ngược lại. Sự lựa chọn giữa hai người sẽ phụ thuộc vào các yếu tố khác. Tôi đã học được Perl trước khi có một Python, vì vậy tôi có xu hướng sử dụng nó. Python có ít cú pháp bị lỗi và thường đơn giản hơn để tìm hiểu. Perl 6, khi nó trở nên có sẵn, sẽ là một sự phát triển hấp dẫn.

(Lưu ý rằng 'tổng quan' của Perl và Python, đặc biệt là woefully không đầy đủ;. Toàn bộ cuốn sách có thể được viết về chủ đề này)

+69

Bài đăng A ++++, sẽ đọc lại! –

+18

tuyệt vời đặc biệt là "khi sử dụng mỗi" một phần –

+2

Tôi không nghĩ rằng Python là một phản ứng đối với Perl. Sự hiểu biết của tôi là nó bắt đầu cuộc sống như một ngôn ngữ kịch bản cho Amoeba (một nghiên cứu unix-ish O/S) và khá độc lập. – ConcernedOfTunbridgeWells

19

Tôi sẽ không gọi sed một ngôn ngữ lập trình chính thức, đó là trình soạn thảo luồng với các cấu trúc ngôn ngữ nhằm chỉnh sửa các tệp văn bản theo chương trình.

Awk là ngôn ngữ đa dụng hơn một chút nhưng vẫn phù hợp nhất để xử lý văn bản.

Perl và Python hoàn toàn chính thức, ngôn ngữ lập trình mục đích chung. Perl có nguồn gốc của nó trong xử lý văn bản và có một số cấu trúc giống như awk (thậm chí có một kịch bản awk-to-perl trôi nổi trên mạng). Có nhiều sự khác biệt giữa Perl và Python, đặt cược tốt nhất của bạn có lẽ là để đọc tóm tắt của cả hai ngôn ngữ trên một cái gì đó giống như Wikipedia để có được một nắm bắt tốt về những gì họ đang có.

+2

Tôi đã nhìn thấy một thực hiện sed của Sokoban, có nghĩa là Turing Completeness. Tuy nhiên, điều đó cũng có thể nói về sendmail.cf và TeX. – ConcernedOfTunbridgeWells

+6

Tôi đã làm việc với một người đã từng viết PostScript để biến máy in laser thành bộ định tuyến. –

+9

@Sam: Wow! Tôi không biết laser của máy in có thể được quay lên đủ để cắt gỗ! Ồ, xin lỗi, loại router sai. –

21

Thứ nhất, có hai điều không liên quan trong danh sách "Perl, Python awk và sed ".

Điều 1 - các công cụ thao tác văn bản đơn giản.

  • sed. Nó có phạm vi công việc cố định, tương đối đơn giản được xác định bởi ý tưởng đọc và kiểm tra từng dòng của một tệp. sed không được thiết kế để có thể đọc được. Nó được thiết kế rất nhỏ và rất hiệu quả trên các máy chủ unix rất nhỏ.

  • awk. Nó có một phạm vi công việc ít cố định, ít đơn giản hơn. Tuy nhiên, vòng lặp chính của chương trình awk được xác định bằng cách đọc ngầm định các dòng của tệp nguồn.

Đây không phải là ngôn ngữ lập trình "hoàn chỉnh". Trong khi bạn có thể - với một số công việc - viết các chương trình khá phức tạp trong awk, nó nhanh chóng trở nên phức tạp và khó đọc.

Điều 2 - ngôn ngữ lập trình đa năng. Chúng có nhiều loại câu lệnh phong phú, nhiều cấu trúc dữ liệu tích hợp và không có giả định hoặc lối tắt có dây để nói.

  • Perl.

  • Python.

Thời điểm sử dụng.

  • sed. Không bao giờ. Nó thực sự không có bất kỳ giá trị nào trong kỷ nguyên hiện đại của máy tính với hơn 32K bộ nhớ. Perl hoặc Python làm những điều tương tự rõ ràng hơn.

  • awk. Không bao giờ. Giống như sed, nó phản ánh một kỷ nguyên máy tính trước đó. Thay vì duy trì ngôn ngữ này (ngoài tất cả các ngôn ngữ khác cần thiết cho một hệ thống thành công), thật dễ chịu khi chỉ làm mọi thứ bằng một ngôn ngữ dễ chịu.

  • Perl. Bất kỳ vấn đề lập trình nào dưới mọi hình thức. Nếu bạn thích cú pháp suy nghĩ tự do, nơi có nhiều, nhiều cách để làm điều tương tự, perl là thú vị.

  • Python. Bất kỳ vấn đề lập trình nào dưới mọi hình thức. Nếu bạn thích cú pháp khá hạn chế, nơi có ít sự lựa chọn hơn, ít tinh tế hơn, và (có lẽ) rõ ràng hơn. Tính chất hướng đối tượng của Python làm cho nó phù hợp hơn với các vấn đề lớn, phức tạp.

Bối cảnh - Tôi không băm nhỏ và lúng túng. Tôi đã học được cách đây hơn 20 năm. Đã làm nhiều thứ với nó; được sử dụng để dạy nó như là một kỹ năng unix cốt lõi. Tôi đã học được Perl khoảng 15 năm trước. Đã làm nhiều điều phức tạp với nó. Tôi đã bỏ lại cả hai vì tôi có thể làm những điều tương tự trong Python - và nó đơn giản và rõ ràng hơn.

Có hai vấn đề nghiêm trọng với sed và awk, không phải là tuổi của chúng.

  1. Tính không đầy đủ của việc triển khai. Tất cả mọi thứ sed và awk làm có thể được thực hiện trong Python hoặc Perl, thường đơn giản hơn và đôi khi nhanh hơn, quá. Một đường ống vỏ có một số lợi thế về hiệu suất vì đa xử lý của nó. Python cung cấp một mô-đun subprocess để cho phép tôi khôi phục những lợi thế đó.

  2. Sự cần thiết phải tìm hiểu một ngôn ngữ khác. Bằng cách thực hiện mọi thứ bằng Python (hoặc Perl), việc triển khai của bạn phụ thuộc vào ít ngôn ngữ hơn, với sự gia tăng rõ ràng.

+56

Một số đối số khá béo phì chống lại awk/sed. Cờ lê điều chỉnh đã không thay thế các cờ lê mở cho cùng một lý do sed và awk vẫn tàu. Đôi khi công cụ đơn giản là tốt nhất cho công việc. Tôi viết rất nhiều perl, nhưng đối với một chuỗi đơn giản của lệnh đường ống, awk/sed nhanh hơn perl -e – RET

+23

Bạn không thể giả định sẵn có của bất cứ điều gì nhưng sh, sed và awk trên hầu hết các hệ thống Unix unix. Nếu bạn muốn một cái gì đó để làm việc trên một hộp Solaris, HP/UX hoặc AIX cài đặt, bạn đang mắc kẹt với sed và awk. – ConcernedOfTunbridgeWells

+1

@NXC: không thực sự. Perl và Python có sẵn từ các nhà cung cấp. Ví dụ: xem http://www-03.ibm.com/systems/p/os/aix/linux/ –

10

Khi nào sử dụng: awk - never - S. Lott.

Tôi nghĩ S. Lott hơi bỏ lỡ dấu với đề xuất này. Thực tế là, trên Linux và các môi trường UNIX khác, awk là một công cụ hữu ích được sử dụng với bash, sh và ksh để xử lý văn bản nhanh. Ý tưởng về việc viết kịch bản chính là bạn giải quyết vấn đề của mình bằng cách dán lại công cụ này, công cụ đó. Do đó trong kịch bản quản trị, thông thường có ls, grep, |, awk, time, ps, v.v. Mỗi công cụ là trình biên dịch kết hợp như một viên gạch xây dựng bằng gạch để hoàn thành tòa nhà (để giải quyết vấn đề ở bàn tay) .

Ví dụ: Tôi là thành viên nhóm của nhóm quản lý paintball gear supplies dotcom. Trang web thương mại điện tử này dựa trên ngăn xếp LAMP. Để xử lý tự động và chuẩn hóa nguồn cấp dữ liệu từ các nhà cung cấp khác nhau vào cơ sở dữ liệu phía sau, chúng tôi sử dụng và duy trì sự kết hợp đa dạng các tập lệnh, bao gồm bash, perl, php và thậm chí là mong đợi. Mỗi điểm có điểm mạnh dựa trên các mô-đun và API có sẵn. Trong các kịch bản lệnh bash, chúng tôi thực hiện các mẫu nhanh chóng phù hợp và hành động thích hợp trên các mẫu khi cần thiết bằng cách sử dụng awk mà không cần chuyển sang PERL. Một điều tôi cũng muốn chỉ ra, điều mà chưa được nhấn mạnh trong chủ đề, đó là một số lượng hợp lý các tập lệnh này đã được mua hoặc nhận từ nguồn mở. Nếu kịch bản đến như Perl, chúng tôi duy trì nó như Perl; nếu kịch bản là Php, chúng tôi duy trì nó như Php; nếu nó đến như bash, chúng tôi duy trì nó như bash; chúng tôi không viết lại nó bằng ngôn ngữ khác chỉ bởi vì chúng tôi nghĩ rằng nó kém hiệu quả hơn trong ngôn ngữ gốc.

+7

nó đã được S.Lott người đã viết rằng phản ứng bạn đã trích dẫn, không brian d foy ... – plusplus

+4

như lưu ý bên trên câu trả lời khá cũ này: không bao giờ phân tích đầu ra của 'ls', sử dụng glob thay thế. [đọc này.] (http://mywiki.wooledge.org/ParsingLs) –

80

Sau khi làm chủ được vài chục ngôn ngữ, bạn sẽ thấy mệt mỏi với những người như S. Lott (xem câu trả lời gây tranh cãi cho câu hỏi này, gần một nửa số phiếu bầu tăng lên (+ 45/-22) sáu năm sau khi trả lời) .

Sed là công cụ tốt nhất cho đường ống dẫn dòng lệnh cực kỳ đơn giản. Trong tay của một bậc thầy sed, nó phù hợp cho một-off phức tạp tùy ý, nhưng nó không nên được sử dụng trong mã sản xuất ngoại trừ trong đường ống thay thế rất đơn giản. Những thứ như 's/this/that /.'

Gawk (GNU awk) là lựa chọn tốt nhất cho việc định dạng dữ liệu phức tạp khi chỉ có một nguồn đầu vào đơn và đầu ra đơn (hoặc nhiều đầu ra được tuần tự viết).Vì rất nhiều công việc trong thế giới thực phù hợp với mô tả này, và một lập trình viên giỏi có thể học diều hâu trong hai giờ, đó là sự lựa chọn tốt nhất. Trên hành tinh này, đơn giản và nhanh hơn là tốt hơn!

Perl hoặc Python tốt hơn nhiều so với bất kỳ phiên bản awk hoặc sed nào khi bạn có các tình huống đầu vào/đầu ra rất phức tạp. Vấn đề càng phức tạp, bạn càng sử dụng python tốt hơn, từ quan điểm bảo trì và dễ đọc. Tuy nhiên, lưu ý rằng một lập trình viên tốt có thể viết mã có thể đọc được bằng bất kỳ ngôn ngữ nào, và một lập trình viên xấu có thể viết những thứ không thể hiểu được bằng bất kỳ ngôn ngữ hữu ích nào, vì vậy việc lựa chọn perl hoặc python một cách an toàn có thể được để lại tùy chọn của lập trình viên có kỹ năng và thông minh.

+7

100% đã đồng ý. Biết nhiều nhất, nếu không phải tất cả các công cụ VÀ khi sử dụng mỗi công cụ đều phân biệt một kỹ thuật viên giỏi từ một công cụ tầm thường. – ata

+4

Tôi sẽ thêm một lý do khác để chọn Python hoặc Perl thay vì awk là khi các yêu cầu chuyển đổi của bạn liên quan đến việc xác thực phức tạp hoặc logic mà ngôn ngữ khác có một mô-đun mạnh mẽ, hiện có. Hãy suy nghĩ về những gì cần thực hiện để xử lý đúng cách, ví dụ: email hoặc địa chỉ đường phố trong awk và bạn sẽ thấy những gì tôi có nghĩa là: perl và python có thư viện mà làm cho những thứ như tầm thường này, trong awk này là không phổ biến hoặc không có sẵn. – Sorpigal

+3

Trên thực tế như Perl được thiết kế để bao gồm cả Sed và Awk; Tôi thấy dễ dàng hơn khi viết nó trong Perl, thay vì học Sed hay Awk. –