Quali sono le differenze tra Perl, Python, AWK e sed? [chiuso]


253

voglio solo sapere quali sono le principali differenze tra loro? e la potenza di ogni lingua (dove è meglio usarla).

Modifica: non è "vs." come argomento, solo informazioni.


142
Questo tipo di cosiddette domande non costruttive sono davvero utili.
Steam,

10
Certo, una scheda in prima pagina per trovarli sarebbe utile ...

Per l'utilità di Python sulla riga di comando, vedi pyp
Neil McGuigan,

Risposte:


550

In ordine di apparizione, le lingue sono sed, awk, perl, python.

Il sedprogramma è un editor di stream ed è progettato per applicare le azioni da uno script a ciascuna riga (o, più in generale, a intervalli di righe specificati) del file o dei file di input. Il suo linguaggio è basato sull'editor edUnix e sebbene abbia condizionali e così via, è difficile lavorare con compiti complessi. Puoi fare piccoli miracoli con esso - ma a un costo per i capelli sulla tua testa. Tuttavia, è probabilmente il più veloce dei programmi quando si tenta di eseguire attività di sua competenza. (Ha le espressioni regolari meno potenti dei programmi discussi - adeguate per molti scopi, ma certamente non PCRE - Espressioni regolari compatibili Perl)

Il awkprogramma (nome dalle iniziali dei suoi autori - Aho, Weinberger e Kernighan) è inizialmente uno strumento per la formattazione dei report. Può essere usato come un trito sed; nelle sue versioni più recenti, è computazionalmente completo. Utilizza un'idea interessante: il programma si basa su "modelli corrispondenti" e "azioni intraprese quando il modello corrisponde". I modelli sono abbastanza potenti (espressioni regolari estese). Il linguaggio per le azioni è simile a C. Una delle caratteristiche principali di awkè che divide automaticamente l'input in record e ogni record in campi.

Perl è stato scritto in parte come un killer e sed-killer. Due dei programmi forniti sono a2pe s2pper la conversione di awkscript e sedscript in Perl. Perl è uno dei primi della prossima generazione di linguaggi di scripting (Tcl / Tk può probabilmente rivendicare il primato). Ha una potente gestione integrata delle espressioni regolari con un linguaggio molto più potente. Fornisce l'accesso a quasi tutte le chiamate di sistema e ha l'estensibilità dei moduli CPAN. (Né awksedè estensibile.) Uno dei motti di Perl è "TMTOWTDI - C'è più di un modo per farlo" (pronunciato "tim-toady"). Perl ha "oggetti", ma è più un componente aggiuntivo che una parte fondamentale del linguaggio.

Python è stato scritto per ultimo, e probabilmente in parte come reazione a Perl. Ha alcune idee sintattiche interessanti (rientrare per indicare i livelli - senza parentesi graffe o equivalenti). È più orientato fondamentalmente agli oggetti di Perl; è estensibile come Perl.

OK - quando usarli?

  • Sed: quando è necessario eseguire semplici trasformazioni di testo sui file.
  • Awk - quando hai solo bisogno di una semplice formattazione e riepilogo o trasformazione dei dati.
  • Perl - per quasi tutte le attività, ma soprattutto quando l'attività ha bisogno di espressioni regolari complesse.
  • Python - per le stesse attività per le quali potresti usare Perl.

Non sono a conoscenza di nulla che Perl possa fare che Python non può fare, né viceversa. La scelta tra i due dipenderebbe da altri fattori. Ho imparato il Perl prima che esistesse un Python, quindi tendo ad usarlo. Python ha una sintassi meno accentuata ed è generalmente un po 'più semplice da imparare. Perl 6, quando sarà disponibile, sarà uno sviluppo affascinante.

(Si noti che le "panoramiche" di Perl e Python, in particolare, sono terribilmente incomplete; interi libri potrebbero essere scritti sull'argomento.)


82
Un post ++++, rileggerei!
Robert Gamble,

24
fantastico soprattutto "quando usare ogni" parte
Khaled Al Hourani il

6
nota che lo zen di Python è fondamentalmente l'antitesi di TMTOWTDI, quindi direi che potrebbe essere una reazione al perl. iirc TCL era leggermente dopo il perl ed è anche abbastanza reazionario contro il perl, sebbene la reazione di TCL sia nella sintassi e nella complessità del linguaggio, non in modi per fare le cose
jk.

7
Qualunque siano le intenzioni originali, è chiaro che in seguito lo sviluppo di Python e la comunità di Python hanno preferito la leggibilità e la coerenza rispetto alla sintassi più flessibile ma concisa. Post eccellente Jonathan
Martin Beckett,

4
@blasto: Per ETL, mi piacerebbe dare la priorità awknel corso sedper l'apprendimento (anche se entrambi hanno ancora i loro usi). Per quanto riguarda le dimensioni dell'attività: sedè al suo meglio quando elabora una riga alla volta, senza spazio di archiviazione da una riga all'altra. awkviene spesso utilizzato per creare array associativi con i dati accumulati da tutte le fonti; utilizza più memoria ed è quindi molto più probabile che si verifichino problemi con set di dati di grandi dimensioni di quanto non lo sedsia. Non ne ho sentito parlare tsawkprima che ti collegassi ad esso. Tendo a ripiegare su Perl (ma potresti fare di meglio con Python) quando un compito è troppo per awk.
Jonathan Leffler,

91

Dopo aver imparato alcune decine di lingue, ti stanchi di persone come S. Lott (vedi la sua controversa risposta a questa domanda, quasi la metà del numero di voti negativi (+ 45 / -22) sei anni dopo aver risposto).

Sed è lo strumento migliore per pipeline a riga di comando estremamente semplici. Nelle mani di un maestro di sed, è adatto per una tantum di complessità arbitraria, ma non dovrebbe essere usato nel codice di produzione se non in condutture di sostituzione molto semplici. Cose come 's / this / that /.'

Gawk (GNU awk) è di gran lunga la scelta migliore per la riformattazione di dati complessi quando c'è solo una singola sorgente di input e un singolo output (o, più output scritti in sequenza). Poiché gran parte del lavoro del mondo reale è conforme a questa descrizione e un buon programmatore può imparare a gawk in due ore, è la scelta migliore. Su questo pianeta, più semplice e veloce è meglio!

Perl o Python sono di gran lunga migliori di qualsiasi versione di awk o sed quando si hanno scenari di input / output molto complessi. Più complesso è il problema, migliore è l'utilizzo di Python, dal punto di vista della manutenzione e della leggibilità. Si noti, tuttavia, che un buon programmatore può scrivere codice leggibile in qualsiasi lingua, e un cattivo programmatore può scrivere schifezze non mantenibili in qualsiasi lingua utile, quindi la scelta di perl o python può essere tranquillamente lasciata alle preferenze del programmatore se detto programmatore è abile e intelligente.


9
100% concordato. Conoscere di più, se non tutti gli strumenti E quando usarli, è ciò che distingue un buon tecnico da uno mediocre.
ata

6
Aggiungerò che un altro motivo per scegliere Python o Perl invece di awk è quando i requisiti di trasformazione implicano una convalida complessa o una logica per la quale un'altra lingua ha un modulo esistente e robusto. Pensa a cosa sarebbe necessario per gestire correttamente, ad esempio, gli indirizzi e-mail o gli indirizzi in awk e vedrai cosa intendo: perl e python hanno librerie che rendono le cose del genere banali, in awk sono rare o non disponibili.
sorpigale il

3
In realtà, poiché Perl è stato progettato per comprendere sia Sed che Awk; Trovo più facile semplicemente scriverlo in Perl, piuttosto che imparare Sed o Awk.
Brad Gilbert,

@BradGilbert: come ho appena menzionato nella risposta in alto, un avvertimento di Perl (& Python, ruby, ecc.) Su awk è che un qualche tipo di regexp è molto più lento nel primo: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac,

1
@OlivierDulac Sì, che mostra un caso patologico. Se cambi da a?ⁿaⁿa a??ⁿaⁿquindi eseguilo in Perl 5 con un valore di 1.000.000, verrà eseguito in meno di due secondi. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Se esegui l'ingenuo, ci vogliono più di due secondi per uno di soli 25. La cosa che devi realizzare è che Perl ha più funzionalità regex di quelle più veloci, incluso consentire di avere il codice Perl all'interno del regex che altera ciò che corrisponde . Se lo desideri, puoi implementare un modulo che scambia il built-in con uno di quegli altri.
Brad Gilbert,

21

Non definirei sed un linguaggio di programmazione completo, è un editor di stream con costrutti di linguaggio volti a modificare i file di testo a livello di codice.

Awk è un po 'più di un linguaggio generico ma è ancora più adatto per l'elaborazione del testo.

Perl e Python sono linguaggi di programmazione generici a tutti gli effetti. Perl ha le sue radici nell'elaborazione del testo e ha una serie di costrutti simili a awk (esiste persino uno script da awk a perl che fluttua sulla rete). Ci sono molte differenze tra Perl e Python, la tua scommessa migliore è probabilmente quella di leggere i riassunti di entrambe le lingue su qualcosa come Wikipedia per avere una buona comprensione di ciò che sono.


2
Ho visto un'implementazione di Sokoban, che implicherebbe Turing Completezza. Tuttavia, ciò si può dire anche di sendmail.cf e TeX.
Preoccupato di

7
Una volta ho lavorato con un ragazzo che ha scritto PostScript per trasformare una stampante laser in un router.
Sam Kington,

10
@ Sam: Wow! Non sapevo che il laser di una stampante potesse essere avviato a sufficienza per tagliare la legna! Oh, scusa, tipo di router sbagliato.
In pausa fino a nuovo avviso.

2
sed, non una lingua a tutti gli effetti? Bene, non è del tutto vero, dato che sed è in piena attività ;)
bernard paulus,

1
Ho visto un'implementazione del quarto linguaggio in awk. (Dato che awk può essere considerato un parser di per sé, è piuttosto semplice implementare un interprete in esso).
Tatjana Heuser,

19

Innanzitutto, ci sono due cose non correlate nella lista "Perl, Python awk e sed".

Cosa 1 - strumenti di manipolazione del testo semplicistici.

  • sed. Ha un ambito di lavoro fisso, relativamente semplice, definito dall'idea di leggere ed esaminare ogni riga di un file. sed non è progettato per essere particolarmente leggibile. È progettato per essere molto piccolo e molto efficiente su server unix molto piccoli.

  • awk. Ha un ambito di lavoro leggermente meno fisso, meno semplice. Tuttavia, il ciclo principale di un programma awk è definito dalla lettura implicita delle righe di un file sorgente.

Questi non sono linguaggi di programmazione "completi". Mentre puoi - con un po 'di lavoro - scrivere programmi abbastanza sofisticati in awk, diventa rapidamente complicato e difficile da leggere.

Cosa 2 - linguaggi di programmazione generici. Questi hanno una ricca varietà di tipi di istruzioni, numerose strutture di dati integrate e nessuna ipotesi cablata o scorciatoie di cui parlare.

  • Perl.

  • Pitone.

Quando usarli.

  • sed. Mai. In realtà non ha alcun valore nell'era moderna dei computer con oltre 32 KB di memoria. Perl o Python fanno le stesse cose in modo più chiaro.

  • awk. Mai. Come sed, riflette un'era precedente dell'informatica. Piuttosto che mantenere questa lingua (oltre a tutte le altre richieste per un sistema di successo), è più piacevole fare semplicemente tutto in una lingua piacevole.

  • Perl. Qualsiasi problema di programmazione di qualsiasi tipo. Se ti piace la sintassi del libero pensiero, dove ci sono molti, molti modi per fare la stessa cosa, perl è divertente.

  • Pitone. Qualsiasi problema di programmazione di qualsiasi tipo. Se ti piace la sintassi abbastanza limitata, dove ci sono meno scelte, meno sottigliezza e (forse) più chiarezza. La natura orientata agli oggetti di Python lo rende più adatto a problemi grandi e complessi.

Sfondo - Non sto prendendo a pugni sed e sbalordendo per ignoranza. Ho imparato awk oltre 20 anni fa. Ha fatto molte cose con esso; usato per insegnarlo come abilità unix di base. Ho imparato il Perl circa 15 anni fa. Ha fatto molte cose sofisticate con esso. Ho lasciato entrambi indietro perché posso fare le stesse cose in Python - ed è più semplice e più chiaro.

Ci sono due seri problemi con sed e awk, nessuno dei quali ha la loro età.

  1. L'incompletezza della loro attuazione. Tutto ciò che sed e awk fanno possono essere fatti in Python o Perl, spesso più semplicemente e talvolta anche più velocemente. Una pipeline di shell presenta alcuni vantaggi in termini di prestazioni grazie alla sua multi-elaborazione. Python offre un subprocessmodulo per permettermi di recuperare quei vantaggi.

  2. La necessità di imparare ancora un'altra lingua. Facendo cose in Python (o Perl) l'implementazione dipende da un minor numero di lingue, con un conseguente aumento della chiarezza.


66
Alcuni argomenti piuttosto fantasiosi contro awk / sed. La chiave regolabile non ha soppiantato la chiave aperta per lo stesso motivo per cui sed e awk sono ancora disponibili. A volte lo strumento semplice è il migliore per il lavoro. Scrivo molto perl, ma per una semplice catena di comandi in pipe, awk / sed sono più veloci di perl -e
RET

27
Non puoi assumere la disponibilità di tutto tranne sh, sed e awk sulla maggior parte dei sistemi unix non Linux. Se vuoi che qualcosa funzioni su un'installazione Solaris, HP / UX o AIX pronta all'uso, sei bloccato con sed e awk.
ConcernedOfTunbridgeWells il

27
La metà dei miei script shell utilizza sed o awk. Sono tutt'altro che morti. Python è il mio linguaggio di scripting preferito, ma a volte sed e awk sono lo strumento migliore per il lavoro. Solo perché sono in uso da molti anni, non significa che siano obsoleti.
Jeremy Cantrell,

16
@ S.Lott: non sto suggerendo che qualcuno dovrebbe tentare di creare un'app Web in awk, ma dire che non dovrebbero mai essere usati è un po 'scandaloso. Per un semplice s & r e / o tweak (specialmente per un file di testo delimitato), perl -e o python -c non sarà mai efficiente come un sed / awk one-liner.
RET

25
Non mi piacciono le risposte come questa. Sed e awk sono facili da capire in poche ore e molto più leggeri e ampiamente disponibili di un linguaggio completo. La programmazione della shell è più rilevante che mai, dicendo "MAI" usare questo o quel tool è semplicemente ritardato. Ma questa idea ritardata non era una delle basi su cui è emerso Perl? Oh bene--
ata il

14

Quando usarli: awk - mai - S. Lott.

Penso che S. Lott abbia leggermente mancato il segno con questa raccomandazione. Il fatto è che su Linux e gli altri ambienti UNIX, awk è uno strumento utile da usare con bash, sh e ksh per veloci elaborazioni di testo. L'idea dello scripting stesso è risolvere il tuo problema incollando insieme questo strumento, quello strumento. Quindi negli script di amministrazione, è comune avere ls, grep, |, awk, time, ps, ecc. Ognuno di essi è uno strumento che lo scripter combina come un costruttore mattone per mattone per completare l'edificio (per risolvere il problema a portata di mano) .

Ad esempio, sono un membro del team che gestisce le forniture di attrezzature per paintballpunto com. Questo sito di e-commerce si basa sullo stack LAMP. Per l'elaborazione automatizzata e la normalizzazione dei feed di dati da vari fornitori nel database di back-end, utilizziamo e manteniamo un mix diversificato di script, tra cui bash, perl, php e persino prevediamo. Ognuno ha i suoi punti di forza in base ai moduli e alle API disponibili. Negli script bash facciamo corrispondere schemi rapidi e azioni appropriate sugli schemi secondo necessità usando awk senza la necessità di passare a PERL. Una cosa che vorrei anche sottolineare, che non è stata sottolineata nel thread, è che un discreto numero di questi script è stato acquistato o ottenuto dall'open source. Se la sceneggiatura è arrivata come Perl, la manteniamo come Perl; se lo script è arrivato come Php, lo manteniamo come Php; se è venuto come bash, lo manteniamo come bash;


7
è stato S. Lott a scrivere quella risposta che hai citato, non brian d foy ...
plusplus

5
come nota a margine di questa risposta piuttosto vecchia: non analizzare mai l'output di ls, usa invece glob. leggi questo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.