- Qual'è la differenza tra awk e sed?
- Che tipo di applicazione sono i casi di utilizzo migliori per gli strumenti sed e awk?
Risposte:
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 sed
con 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
/ while
e 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 printf
e 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 awk
includere mawk
e nawk
.
Entrambi i programmi usano espressioni regolari per selezionare ed elaborare il testo.
Tenderei ad usare sed
dove 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 awk
quando il testo assomiglia più a righe e colonne o, per quanto awk
riguarda 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.
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.
sed
, 's/search/replace'
è molto più facile digitare della awk
sintassi ed è quello che ti serve la maggior parte del tempo.
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 sed
per 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 awk
se si desidera analizzare il testo, ovvero contare i campi, calcolare i totali, estrarre e riorganizzare strutture ecc.
Inoltre non dovresti dimenticartene grep
. Utilizzare grep
se si desidera solo cercare / estrarre qualcosa in un testo (file)