Qual'è la differenza tra sed e awk? [chiuso]


497
  • Qual'è la differenza tra awk e sed?
  • Che tipo di applicazione sono i casi di utilizzo migliori per gli strumenti sed e awk?

2
Un QA correlato su unix.stackexchange: esiste un tutorial di base per grep, awk e sed?
Dani,

Risposte:


550

sedè un editor di stream. Funziona con flussi di caratteri su una base per riga. Ha un linguaggio di programmazione primitivo che include loop in stile goto e semplici condizionali (oltre alla corrispondenza dei modelli e alla corrispondenza degli indirizzi). Esistono essenzialmente solo due "variabili": spazio modello e spazio di attesa. La leggibilità degli script può essere difficile. Le operazioni matematiche sono straordinariamente scomode nella migliore delle ipotesi.

Esistono varie versioni sedcon diversi livelli di supporto per le opzioni della riga di comando e le funzionalità della lingua.

awkè orientato verso i campi delimitati su una riga per riga. Ha molto più robusto costrutti di programmazione compreso if/ else, while, do/ whilee for(C-stile e matrice iterazione). Esiste un supporto completo per variabili e matrici associative monodimensionali più matrici multidimensionali kludgey (IMO). Le operazioni matematiche assomigliano a quelle in C. Ha printfe funzioni. La "K" in "AWK" sta per " K ernighan" come in "Kernighan e Ritchie" del libro "C Programming Language" (non dimenticare A ho e W einberger). Si potrebbe concepibilmente scrivere un rivelatore del plagio accademico usando awk.

GNU awk( gawk) ha numerose estensioni, inclusi veri array multidimensionali nell'ultima versione. Ci sono altre varianti di awkincludere mawke nawk.

Entrambi i programmi usano espressioni regolari per selezionare ed elaborare il testo.

Tenderei ad usare seddove ci sono schemi nel testo. Ad esempio, è possibile sostituire tutti i numeri negativi in ​​alcuni testi nel formato "segno meno seguito da una sequenza di cifre" (ad esempio "-231.45") con il modulo "parentesi del contabile" (ad esempio "(231.45)" ) usando questo (che ha margini di miglioramento):

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

Vorrei usare awkquando il testo assomiglia più a righe e colonne o, per quanto awkriguarda loro "record" e "campi". Se avessi fatto un'operazione simile come sopra, ma solo sul terzo campo in un semplice file delimitato da virgole potrei fare qualcosa del tipo:

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

Naturalmente questi sono solo esempi molto semplici che non illustrano l'intera gamma di funzionalità che ognuno ha da offrire.


7
Per vedere alcuni esempi di superamento dei limiti di sed: sed.sourceforge.net/#scripts
In pausa fino a ulteriore avviso.

@DennisWilliamson - Sono in svantaggio se imparo solo awk? Awk è molto più comunemente usato di sed?
Steam,

4
@blasto: La mia raccomandazione è di imparare entrambi ma con maggiore enfasi su awk. Molte delle espressioni regolari si applicano ad entrambi (e ad altri strumenti e lingue). Usa sed per cose più semplici e cerca di evitare le cose complesse. È davvero bello poter fare loop e rami in sed, ma le righe di comando risultanti sono complesse e difficili da leggere. La risposta alla tua domanda dipende davvero da cosa stai facendo.
In pausa fino a nuovo avviso.

@DennisWilliamson - Quale sarebbe più utile per uno sviluppatore ETL? ETL o Estrai trasformazione e caricamento è un termine di archiviazione dei dati. In parole povere, il lavoro prevede ESTRAZIONE di dati da diverse fonti diverse (come DB, file excel, file csv ecc.), TRASFORMAZIONE degli stessi e quindi CARICAMENTO in un datawarehouse (DW) per analisi, ricerca di schemi nei dati o solo storici record. per esempio. Uso finale di un DW - Gli algoritmi applicati a un DW di un negozio di alimentari che ha dati degli ultimi 10 anni potrebbero rivelare che le persone che tendono ad acquistare mele comprano anche arance o qualcosa di simile.
Steam,

1
Solo un FYI per chiunque si imbatta in questo su un mac, prova "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" per il primo esempio sed
Daniel Schmidt,

124

1) Qual è la differenza tra awk e sed?

Entrambi sono strumenti che trasformano il testo. MA Awk può fare più cose oltre a manipolare il testo. È un linguaggio di programmazione da solo con la maggior parte delle cose che impari in programmazione, come array, loop, controllo del flusso if / else ecc. Puoi "programmare" anche in sed, ma non vorrai mantenere il codice scritto in esso .

2) Quali tipi di applicazioni sono i casi migliori per gli strumenti sed e awk?

Conclusione: utilizzare sed per l'analisi del testo molto semplice. Qualunque cosa oltre a ciò, Awk è meglio. In effetti, puoi abbandonare del tutto sed e usare semplicemente awk. Poiché le loro funzioni si sovrappongono e awk può fare di più, basta usare awk. Ridurrai anche la tua curva di apprendimento.


7
Bel punto sulla curva di apprendimento .. troppi strumenti possono confondersi .. quindi preferirei imparare solo grep e awk .. dimentichiamoci di sed :)
Outlier

174
^^ Abbastanza sed. (scusate, dovevo farlo)
Greg M. Krsak,

8
Trovo che sed sia molto più facile da imparare, quindi devi tenerne conto. Man mano che impari a padroneggiare awk, potrebbe essere utile imparare rapidamente sed per essere in grado di usarlo più velocemente per cose che potresti non sapere ancora come fare in awk.
Didier A.

1
@GregKrsak mi hai reso felice. (scusate, dovevo farlo)
Abel Callejo,

15
Non abbandonare sed, 's/search/replace'è molto più facile digitare della awksintassi ed è quello che ti serve la maggior parte del tempo.
sjas,

55

Entrambi gli strumenti sono pensati per funzionare con il testo e ci sono attività per cui entrambi gli strumenti possono essere utilizzati.

Per me la regola per separarli è: Utilizzare sedper automatizzare manualmente le attività che si farebbero altrimenti in un editor di testo. Ecco perché si chiama stream editor . (Puoi usare gli stessi comandi per modificare il testo in vim). Utilizzare awkse si desidera analizzare il testo, ovvero contare i campi, calcolare i totali, estrarre e riorganizzare strutture ecc.

Inoltre non dovresti dimenticartene grep. Utilizzare grepse si desidera solo cercare / estrarre qualcosa in un testo (file)

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.