Apa perbedaan antara Perl, Python, AWK dan sed? [Tutup]

253

hanya ingin tahu apa perbedaan utama di antara mereka? dan kekuatan setiap bahasa (di mana lebih baik menggunakannya).

Sunting: ini bukan "vs." seperti topik, hanya informasi.

Khaled Al Hourani
sumber
142
Jenis pertanyaan yang tidak konstruktif seperti ini sangat membantu.
Steam
10
Tentu, tab di halaman depan untuk menemukan mereka akan berguna ...
Untuk kegunaan python pada baris perintah, lihat pyp
Neil McGuigan

Jawaban:

550

Dalam rangka penampilan, bahasa yang sed, awk, perl, python.

The sedProgram adalah editor aliran dan dirancang untuk menerapkan tindakan dari script untuk setiap baris (atau, lebih umum, untuk rentang tertentu dari garis) dari file input atau file. Bahasanya didasarkan pada ed, editor Unix, dan meskipun memiliki persyaratan dan sebagainya, sulit untuk bekerja dengan untuk tugas-tugas kompleks. Anda dapat melakukan mukjizat kecil dengan itu - tetapi dengan biaya untuk rambut di kepala Anda. Namun, itu mungkin yang tercepat dari program ketika mencoba tugas-tugas dalam pengirimannya. (Ini memiliki ekspresi reguler paling kuat dari program yang dibahas - memadai untuk banyak tujuan, tetapi tentu saja tidak PCRE - Ekspresi Reguler Kompatibel Kompatibel)

The awkProgram (nama dari inisial penulisnya - Aho, Weinberger, dan Kernighan) adalah alat awalnya untuk memformat laporan. Dapat digunakan sebagai sup sed; dalam versi yang lebih baru, ini komputasional lengkap. Ini menggunakan ide yang menarik - program ini didasarkan pada 'pola yang cocok' dan 'tindakan yang diambil ketika pola cocok'. Polanya cukup kuat (Extended Regular Expressions). Bahasa untuk tindakan mirip dengan C. Salah satu fitur utama awkadalah bahwa ia membagi input secara otomatis ke dalam catatan dan setiap catatan ke dalam bidang.

Perl ditulis sebagian sebagai awk-killer dan sed-killer. Dua dari program yang disediakan dengan itu yang a2pdan s2puntuk mengkonversi awkskrip dan sedscript ke Perl. Perl adalah salah satu yang paling awal dari generasi bahasa scripting berikutnya (Tcl / Tk mungkin bisa mengklaim keunggulan). Ini memiliki penanganan ekspresi reguler terintegrasi yang kuat dengan bahasa yang jauh lebih kuat. Ini menyediakan akses ke hampir semua panggilan sistem dan memiliki ekstensibilitas modul CPAN. (Tidak awkjuga sedtidak dapat diperpanjang.) Salah satu motto Perl adalah "TMTOWTDI - Ada lebih dari satu cara untuk melakukannya" (diucapkan "tim-toady"). Perl memiliki 'objek', tetapi lebih merupakan add-on daripada bagian mendasar dari bahasa.

Python ditulis terakhir, dan mungkin sebagian sebagai reaksi terhadap Perl. Ini memiliki beberapa ide sintaksis yang menarik (indentasi untuk menunjukkan level - tanpa kawat gigi atau yang setara). Ini lebih berorientasi objek daripada Perl; itu sama extensible dengan Perl.

OK - kapan harus menggunakan masing-masing?

  • Sed - ketika Anda perlu melakukan transformasi teks sederhana pada file.
  • Awk - saat Anda hanya perlu memformat dan meringkas atau mengubah data.
  • Perl - untuk hampir semua tugas, tetapi terutama ketika tugas membutuhkan ekspresi reguler yang kompleks.
  • Python - untuk tugas yang sama yang bisa Anda gunakan untuk Perl.

Saya tidak mengetahui apa pun yang Perl dapat melakukan itu Python tidak bisa, atau sebaliknya. Pilihan antara keduanya akan tergantung pada faktor-faktor lain. Saya belajar Perl sebelum ada Python, jadi saya cenderung menggunakannya. Python memiliki sintaks yang kurang bertambah dan umumnya agak mudah dipelajari. Perl 6, ketika tersedia, akan menjadi perkembangan yang menarik.

(Perhatikan bahwa 'ikhtisar' Perl dan Python, khususnya, sangat tidak lengkap; seluruh buku dapat ditulis pada topik.)

Jonathan Leffler
sumber
82
Pos ++++, akan dibaca lagi!
Robert Gamble
24
luar biasa terutama bagian "kapan harus menggunakan masing-masing"
Khaled Al Hourani
6
perhatikan zen dari python pada dasarnya adalah kebalikan dari TMTOWTDI jadi saya akan mengatakan itu bisa menjadi reaksi terhadap perl. iirc TCL sedikit setelah perl dan juga cukup reaksioner terhadap perl, meskipun reaksi TCL adalah dalam sintaks dan kompleksitas bahasa, bukan cara untuk melakukan sesuatu
jk.
7
Apa pun maksud aslinya, jelas bahwa pengembangan Python di kemudian hari dan komunitas python lebih memilih keterbacaan dan konsistensi daripada sintaksis Perl yang lebih fleksibel tetapi singkat. Pos luar biasa Jonathan
Martin Beckett
4
@blasto: Untuk ETL, saya akan memprioritaskan awklebih seduntuk belajar (meskipun keduanya masih memiliki kegunaan). Adapun ukuran tugas: sedadalah yang terbaik ketika memproses satu baris pada satu waktu, tanpa penyimpanan dari baris ke baris. awksering digunakan untuk membangun array asosiatif dengan data yang terakumulasi dari semua sumber; itu menggunakan lebih banyak memori, dan karena itu jauh lebih mungkin untuk mengalami masalah dengan set data besar daripada yang sedada. Saya belum pernah mendengar tsawksebelum Anda menautkannya. Saya cenderung untuk kembali ke Perl (tetapi Anda mungkin melakukan yang lebih baik dengan Python) ketika tugas terlalu banyak awk.
Jonathan Leffler
91

Setelah menguasai beberapa lusin bahasa, Anda bosan dengan orang-orang seperti S. Lott (lihat jawaban kontroversialnya untuk pertanyaan ini, hampir setengah jumlah suara turun dari (+ 45 / -22) enam tahun setelah menjawab).

Sed adalah alat terbaik untuk pipa saluran perintah yang sangat sederhana. Di tangan master sed, itu cocok untuk satu kali kompleksitas arbitrer, tetapi tidak boleh digunakan dalam kode produksi kecuali dalam pipa substitusi yang sangat sederhana. Hal-hal seperti 'ini / itu / itu.'

Gawk (GNU awk) sejauh ini merupakan pilihan terbaik untuk memformat ulang data yang kompleks ketika hanya ada satu sumber input tunggal dan satu output tunggal (atau, beberapa output ditulis secara berurutan). Karena banyak pekerjaan dunia nyata sesuai dengan deskripsi ini, dan seorang programmer yang baik dapat belajar melongo dalam dua jam, itu adalah pilihan terbaik. Di planet ini, lebih sederhana dan lebih cepat lebih baik!

Perl atau Python jauh lebih baik daripada versi awk atau sed ketika Anda memiliki skenario input / output yang sangat kompleks. Semakin kompleks masalahnya, semakin baik Anda menggunakan python, dari sudut pandang pemeliharaan dan keterbacaan. Perhatikan, bagaimanapun, bahwa seorang programmer yang baik dapat menulis kode yang dapat dibaca dalam bahasa apa pun, dan seorang programmer yang buruk dapat menulis omong kosong yang tidak dapat dipertahankan dalam bahasa apa pun yang berguna, sehingga pilihan perl atau python dapat dengan aman diserahkan kepada preferensi programmer jika programmer tersebut mengatakan terampil dan pintar.

Charlie
sumber
9
100% setuju. Mengetahui sebagian besar, jika tidak semua alat DAN kapan menggunakannya masing-masing adalah apa yang membedakan teknisi yang baik dari yang biasa-biasa saja.
ata
6
Saya akan menambahkan bahwa alasan lain untuk memilih Python atau Perl daripada awk adalah ketika persyaratan transformasi Anda melibatkan validasi kompleks atau logika yang bahasa lain memiliki modul yang kuat dan sudah ada. Pikirkan tentang apa yang diperlukan untuk menangani dengan benar misalnya email atau alamat jalan dalam awk dan Anda akan melihat apa yang saya maksud: perl dan python memiliki perpustakaan yang membuat hal-hal seperti ini sepele, di awk ini tidak umum atau tidak tersedia.
sorpigal
3
Sebenarnya sebagai Perl dirancang untuk mencakup Sed dan Awk; Saya merasa lebih mudah untuk hanya menulisnya di Perl, daripada belajar Sed atau Awk.
Brad Gilbert
@BradGilbert: seperti yang baru saja saya sebutkan di jawaban atas, peringatan Perl (& Python, ruby, dll) mengenai awk adalah bahwa beberapa jenis regexp reaaaaaaaaaal lebih lambat pada yang sebelumnya: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac
1
@OlivierDulac Ya itu menunjukkan kasus patologis. Jika Anda mengubah dari a?ⁿaⁿuntuk a??ⁿaⁿkemudian jalankan di Perl 5 dengan 1.000.000 itu berjalan dalam waktu kurang dari dua detik. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Jika Anda menjalankan yang naif, dibutuhkan lebih dari dua detik untuk hanya 25. Hal yang harus Anda sadari adalah Perl memiliki lebih banyak fitur regex daripada yang lebih cepat termasuk memungkinkan Anda untuk memiliki kode Perl di dalam regex yang mengubah apa yang cocok. . Anda bisa mengimplementasikan modul yang menukar built-in untuk salah satu dari yang lainnya jika Anda mau.
Brad Gilbert
21

Saya tidak akan menyebut sed sebagai bahasa pemrograman yang lengkap, itu adalah editor aliran dengan konstruksi bahasa yang ditujukan untuk mengedit file teks secara terprogram.

Bahasa awk sedikit lebih dari bahasa tujuan umum tetapi masih paling cocok untuk pemrosesan teks.

Perl dan Python sepenuhnya dikembangkan, bahasa pemrograman untuk tujuan umum. Perl berakar pada pemrosesan teks dan memiliki sejumlah konstruksi seperti awk (bahkan ada skrip awk-to-perl yang melayang-layang di internet). Ada banyak perbedaan antara Perl dan Python, taruhan terbaik Anda mungkin adalah membaca ringkasan kedua bahasa pada sesuatu seperti Wikipedia untuk mendapatkan pemahaman yang baik tentang apa itu.

Robert Gamble
sumber
2
Saya telah melihat implementasi Sokoban, yang menyiratkan Turing Completeness. Namun, itu juga bisa dikatakan tentang sendmail.cf dan TeX.
ConcernedOfTunbridgeWells
7
Saya pernah bekerja dengan seorang pria yang menulis PostScript untuk mengubah printer laser menjadi router.
Sam Kington
10
@ Sam: Wow! Saya tidak tahu laser printer bisa dihidupkan cukup untuk memotong kayu! Oh, maaf, jenis router yang salah.
Dijeda sampai pemberitahuan lebih lanjut.
2
sed, bukan bahasa lengkap? Ya, itu tidak sepenuhnya benar, karena sed sudah selesai ;)
bernard paulus
1
Saya telah melihat implementasi bahasa keempat dalam awk. (Karena awk dapat dianggap sebagai parser dengan haknya sendiri, agak mudah untuk menerapkan penerjemah di dalamnya).
Tatjana Heuser
19

Pertama, ada dua hal yang tidak terkait dalam daftar "Perl, Python awk and sed".

Hal 1 - alat manipulasi teks sederhana.

  • sed. Ini memiliki lingkup pekerjaan yang tetap, relatif sederhana yang ditentukan oleh gagasan membaca dan memeriksa setiap baris file. sed tidak dirancang agar mudah dibaca. Ini dirancang untuk menjadi sangat kecil dan sangat efisien pada server unix yang sangat kecil.

  • awk. Ini memiliki lingkup pekerjaan yang sedikit kurang tetap, kurang sederhana. Namun, loop utama program awk didefinisikan oleh pembacaan tersirat dari baris file sumber.

Ini bukan bahasa pemrograman "lengkap". Meskipun Anda dapat - dengan beberapa pekerjaan - menulis program yang cukup canggih dalam awk, ia dengan cepat menjadi rumit dan sulit dibaca.

Hal 2 - bahasa pemrograman untuk tujuan umum. Ini memiliki beragam jenis pernyataan, banyak struktur data bawaan, dan tidak ada asumsi atau pintasan berkabel untuk berbicara.

  • Perl.

  • Python.

Kapan menggunakannya.

  • sed. Tidak pernah. Ini benar-benar tidak memiliki nilai di era komputer modern dengan memori lebih dari 32 ribu. Perl atau Python melakukan hal yang sama dengan lebih jelas.

  • awk. Tidak pernah. Seperti sed, itu mencerminkan era komputasi sebelumnya. Daripada mempertahankan bahasa ini (selain semua yang diperlukan untuk sistem yang sukses), lebih menyenangkan untuk melakukan semuanya dalam satu bahasa yang menyenangkan.

  • Perl. Masalah pemrograman apa pun. Jika Anda menyukai sintaks berpikir bebas, di mana ada banyak, banyak cara untuk melakukan hal yang sama, perl itu menyenangkan.

  • Python. Masalah pemrograman apa pun. Jika Anda menyukai sintaks yang cukup terbatas, di mana ada lebih sedikit pilihan, lebih sedikit kehalusan, dan (mungkin) lebih jelas. Sifat berorientasi objek Python membuatnya lebih cocok untuk masalah besar dan kompleks.

Background - Saya tidak memukul sed dan canggung karena ketidaktahuan. Saya belajar awk lebih dari 20 tahun yang lalu. Melakukan banyak hal dengannya; digunakan untuk mengajarkannya sebagai keterampilan inti unix. Saya belajar Perl sekitar 15 tahun yang lalu. Melakukan banyak hal canggih dengannya. Saya telah meninggalkan keduanya karena saya dapat melakukan hal yang sama dengan Python - dan lebih sederhana dan lebih jelas.

Ada dua masalah serius dengan sed dan awk, yang keduanya tidak seusia mereka.

  1. Ketidaklengkapan implementasi mereka. Semua yang dilakukan oleh sed dan awk dapat dilakukan dengan Python atau Perl, seringkali lebih sederhana dan terkadang lebih cepat juga. Pipeline shell memiliki beberapa keunggulan kinerja karena multi-processing. Python menawarkan subprocessmodul untuk memungkinkan saya memulihkan keunggulan itu.

  2. Kebutuhan untuk belajar bahasa lain. Dengan melakukan hal-hal dengan Python (atau Perl) implementasi Anda bergantung pada lebih sedikit bahasa, dengan hasil peningkatan kejelasan.

S.Lott
sumber
66
Beberapa argumen yang cukup bodoh terhadap awk / sed. Kunci pas yang dapat disesuaikan belum menggantikan kunci pas terbuka karena alasan yang sama dan muatan masih dikirimkan. Terkadang alat sederhana adalah yang terbaik untuk pekerjaan itu. Saya menulis banyak perl, tetapi untuk rantai sederhana dari perintah pipa, awk / sed lebih cepat dari perl -e
RET
27
Anda tidak dapat mengasumsikan ketersediaan apa pun selain sh, sed dan awk pada sebagian besar sistem unix non-linux. Jika Anda menginginkan sesuatu berfungsi pada instalasi Solaris, HP / UX atau AIX yang out-of-the-box, Anda terjebak dengan sed dan awk.
ConcernedOfTunbridgeWells
27
Setengah dari skrip shell saya menggunakan sed atau awk. Mereka jauh dari mati. Python adalah bahasa scripting pilihan saya, tetapi kadang-kadang sed dan awk adalah alat terbaik untuk pekerjaan itu. Hanya karena mereka telah digunakan selama bertahun-tahun, tidak berarti mereka sudah usang.
Jeremy Cantrell
16
@ S.Lott: Saya tidak menyarankan siapa pun untuk mencoba membuat aplikasi web dalam awk, tetapi mengatakan bahwa mereka tidak boleh digunakan sedikit keterlaluan. Untuk s & r dan / atau tweak yang sederhana (terutama untuk file teks yang dibatasi), perl -e atau python -c tidak akan seefisien sebuah sed-awk one-liner.
RET
25
Saya tidak suka jawaban seperti ini. Sed dan awk mudah dipahami dalam beberapa jam dan jauh lebih ringan dan tersedia secara luas daripada bahasa lengkap. Pemrograman Shell sama relevannya dengan sebelumnya, mengatakan "TIDAK PERNAH" menggunakan alat ini atau itu hanya terbelakang. Tapi, bukankah ide terbelakang ini adalah salah satu dasar dari mana Perl muncul? Oh well--
ata
14

Kapan menggunakannya: awk - never - S. Lott.

Saya pikir S. Lott sedikit ketinggalan tanda dengan rekomendasi ini. Faktanya adalah, di Linux dan lingkungan UNIX lainnya, awk adalah alat yang berguna untuk digunakan dengan bash, sh, dan ksh untuk pemrosesan teks cepat. Gagasan skrip itu sendiri adalah Anda memecahkan masalah Anda dengan menempelkan alat ini bersama-sama, alat itu. Karenanya dalam skrip admin, adalah umum untuk memiliki ls, grep, |, awk, waktu, ps, dll. Masing-masing adalah alat yang digabungkan oleh skrip seperti pembangun bata demi bata untuk menyelesaikan bangunan (untuk menyelesaikan masalah yang dihadapi) .

Misalnya saya adalah anggota tim dari tim yang mengelola persediaan peralatan paintballdotcom. Situs e-commerce ini didasarkan pada tumpukan LAMP. Untuk pemrosesan otomatis dan normalisasi umpan data dari berbagai pemasok ke dalam database back end, kami menggunakan dan memelihara campuran beragam skrip, termasuk bash, perl, php, dan bahkan yang diharapkan. Masing-masing memiliki kekuatan berdasarkan modul dan API yang tersedia. Dalam skrip bash, kami melakukan pencocokan pola cepat dan tindakan yang sesuai pada pola sesuai kebutuhan menggunakan awk tanpa perlu beralih ke PERL. Satu hal yang juga ingin saya tunjukkan, yang belum ditekankan dalam utasnya, adalah bahwa cukup banyak skrip ini dibeli, atau diperoleh dari sumber terbuka. Jika skrip muncul sebagai Perl, kami mempertahankannya sebagai Perl; jika skrip muncul sebagai Php, kami mempertahankannya sebagai Php; jika itu datang sebagai bash, kami mempertahankannya sebagai bash;

tao quam
sumber
7
S.Lott-lah yang menulis respons yang Anda kutip, bukan brian d foy ...
plusplus
5
sebagai catatan pada jawaban yang cukup lama ini: jangan pernah menguraikan output ls, gunakan glob sebagai gantinya. Baca ini.