sed
e awk
sono superset di grep
, ci sono cose che sono più facili da fare con l'una o l'altra.
grep foo
può essere scritto sed '/foo/!d'
o awk /foo/
, ma considera:
grep -i foo
dovrebbe essere a sed '/[fF][oO][oO]/!d'
meno che tu non voglia prendere in considerazione estensioni non standard come GNU sed '/foo/I!d'
. O con awk
: awk 'tolower($0) ~ /foo/'
o ancora utilizzando un'estensione GNU: awk -v IGNORECASE=1 /foo/
.
Cose in cui i diversi strumenti sono bravi e ingombranti con gli altri strumenti:
grep
grep
è uno strumento semplice ma ha modalità operative molto specializzate che sono più difficili da riprodurre con awk
o sed
:
grep -i
per la corrispondenza senza distinzione tra maiuscole e minuscole (vedi sopra)
grep -Fe "$string"
per la ricerca di stringhe fisse ( export string; awk 'index($0, ENVIRON["string"])'
con awk
, nessun equivalente diretto con sed
).
- (non standard)
grep -r
per la ricerca ricorsiva
- (non standard)
grep -P
/ pcregrep
per regexps perl-like (alcune sed
implementazioni hanno il supporto regexp perl-like anche se non i più importanti)
- (non standard)
grep -o
per restituire la parte corrispondente (più righe di awk
o sed
fare lo stesso)
- (non standard)
grep -A/B/C
per restituire il contesto intorno alla partita (ancora doloroso fare in modo simile con sed
o awk
)
sed
s/foo/bar/
: sed
il s
comando ha caratteristiche che sono difficili da implementare awk
come:
s/foo\(.*\)bar/\1/g
: cattura (anche se GNU awk ha gensub()
un'estensione per quello)
s/foo/bar/3
: sostituisce la terza occorrenza su ogni riga
- (non standard): modifica dei file sul posto (anche se ora è supportata da GNU
awk
).
awk
awk
è il più ricco di funzionalità dei tre.
- buono per gestire i numeri
- ottimo per gestire input formattati in colonne.
- ottimo per estrarre e combinare dati da diverse fonti, con i suoi array associativi.
perl
perl
come pratico strumento di estrazione e reportistica ha il meglio di tutti. Questo è quello per cui è stato inizialmente progettato (per essere lo strumento che rende tutto ciò sed
/ awk
obsoleto).
Padroneggiare perl
per eseguire l'elaborazione del testo offre un serio vantaggio. Consiglierei di passarci un po 'di tempo, anche prima di guardare i sed
comandi meno comuni per esempio.
prestazione
Come regola generale, più lo strumento è specializzato, più efficiente è il compito. Ma ciò dipende anche molto dall'implementazione, dall'attività e da alcuni altri fattori e prestazioni che possono avere compromessi che potrebbero dover essere presi in considerazione.
Ad esempio, ci sono alcune grep
o sed
implementazioni che sono molto veloci, ma per esempio non supportano caratteri multibyte, quindi possono funzionare correttamente solo sul testo inglese americano in locali multibyte. Oppure sono veloci perché funzionano su un piccolo buffer a lunghezza fissa e quindi non possono funzionare su input arbitrari ...