- Qual è la differenza tra awk e sed?
- Che tipo di applicazione è meglio utilizzare casi per gli strumenti sed e awk?
risposta
sed
è un editor di flusso. Funziona con flussi di caratteri per riga. Ha un linguaggio di programmazione primitivo che include loop in stile goto e condizionali semplici (oltre alla corrispondenza dei pattern e alla corrispondenza degli indirizzi). Ci sono essenzialmente solo due "variabili": spazio del modello e spazio di attesa. La leggibilità degli script può essere difficile. Le operazioni matematiche sono straordinariamente scomode al meglio.
Esistono varie versioni di sed
con diversi livelli di supporto per le opzioni della riga di comando e le funzionalità della lingua.
awk
è orientato verso campi delimitati su base per riga. Ha costrutti di programmazione molto più robusti tra cui if
/else
, while
, do
/while
e for
(stile C e iterazione di array). C'è un supporto completo per le variabili e gli array associativi a dimensione singola più (IMO) gli array multidimensionali di kludgey. 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" onore (per non dimenticare A ho e W Einberger). Si potrebbe teoricamente scrivere un rilevatore di plagio accademico usando awk
.
GNU awk
(gawk
) ha numerose estensioni, compresi i veri array multidimensionali nell'ultima versione. Esistono altre varianti di awk
tra cui mawk
e nawk
.
Entrambi i programmi utilizzano espressioni regolari per la selezione e l'elaborazione del testo.
Tenderei a utilizzare sed
dove ci sono schemi nel testo. Ad esempio, è possibile sostituire tutti i numeri negativi in un testo che sono nella forma "segno meno seguito da una sequenza di cifre" (ad esempio "-231.45") con il modulo "parentesi contabili" (ad es. "(231.45) ") utilizzando questo (che ha margini di miglioramento):
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
userei awk
quando il testo appare più come righe e colonne o, come awk
si riferisce a loro 'record' e 'campi' If. stavo per fare una simile operazione come sopra, ma solo sul terzo campo in un semplice file delimitato da virgole che potrei fare qualcosa di simile:
awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile
Naturalmente questi sono solo esempi molto semplici che non illustrano la gamma completa di funzionalità che ciascuna 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 a sé stante con la maggior parte delle cose che apprendi in programmazione, come array, loop, se/else controllo di flusso, ecc. Puoi anche "programmare" in sed, ma non vorrai mantenere il codice scritto in esso .
2) Che tipo di applicazione è il caso migliore per gli strumenti sed e awk?
Conclusione: utilizzare sed per l'analisi di testo molto semplice. Qualunque cosa al di là di questo, awk è migliore. In effetti, puoi abbandonare del tutto sedute e usare semplicemente awk. Poiché le loro funzioni si sovrappongono e awk può fare di più, usa semplicemente awk. Ridurrete anche la vostra curva di apprendimento.
Bel punto sulla curva di apprendimento .. troppi strumenti possono mescolare .. quindi preferirei imparare a grep e solo awk .. dimentica di sed :) – Outlier
^^ Abbastanza sed. (mi dispiace, ho dovuto) –
Trovo che sed sia molto più facile da imparare, quindi è necessario tenerne conto. Mentre impari a padroneggiare awk, potrebbe essere utile imparare rapidamente sed per poterlo usare più velocemente per cose che potresti non sapere ancora come fare in awk. –
Entrambi gli strumenti sono pensati per lavorare 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 le attività che altrimenti si farebbero in un editor di testo manualmente. 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 le strutture, ecc.
Inoltre non si dovrebbe dimenticare grep
. Utilizzare grep
se si desidera cercare/estrarre qualcosa in un testo (file)
Un QA correlato su unix.stackexchange: [Esiste un tutorial di base per grep, awk e sed?] (Http: //unix.stackexchange .com/questions/2434/is-there-a-basic-tutorial-for-grep-awk-and-sed) – Dani