Quando usare grep, less, awk, sed [chiuso]


17

Sto entrando nel mondo di Linux e al lavoro sto usando grepsempre di più. In questo modo sto scoprendo che a volte non è adeguato per quello che voglio.

Stavo lottando con grepalcuni giorni fa e un mio collega che è un amministratore senior di Linux, mi ha detto di usare awk. Sono rimasto sbalordito dalla velocità con cui ho ottenuto un risultato.

Quindi la mia domanda è: quando scegli di usarne uno rispetto all'altro? Quali domande posso porre a me stesso prima di andare a lavorare grepe passare molto tempo, quando avrei potuto farlo awke risparmiare tempo?


Questa è una buona domanda ma è davvero molto ampia e principalmente basata sull'opinione pubblica. Per rispondere alla tua domanda, usare grep invece di awk dipende davvero da quanto ti senti a tuo agio con awk / sed. Ci sono alcuni motivi per cui si dovrebbe usare questo su quest'ultimo come cercare qualcosa di più specifico di ciò che grep ha da offrire o se si sta tentando di sostituire / modificare i file con una stringa specifica (usando sed). Ma ancora una volta, tutto dipende dal livello di comfort e dall'esperienza con l'uso di awk / sed.
Ryekayo,

7
Utilizzare lessper visualizzare un file. Utilizzare grepper cercare in un file. Utilizzare sedper modificare un file. Utilizzare awksopra grepe sedquando il file che si desidera elaborare ha una sorta di struttura (come le colonne). Utilizzare sedpiù di awkquando si desidera principalmente a che fare con linee (come linee eliminare o aggiungere di testo). Sono sicuro che qualcuno scriverà una risposta di 20 pagine più completa della mia.
Satō Katsura,

Ciao Sato, non riguarda la lunghezza, ma ciò che viene detto. E poche righe sono molto istruttive. Grazie.
frankguthrie,

Risposte:


25

sede awksono superset di grep, ci sono cose che sono più facili da fare con l'una o l'altra.

grep foopuò essere scritto sed '/foo/!d'o awk /foo/, ma considera:

grep -i foodovrebbe 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 awko 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 -rper la ricerca ricorsiva
  • (non standard) grep -P/ pcregrepper regexps perl-like (alcune sedimplementazioni hanno il supporto regexp perl-like anche se non i più importanti)
  • (non standard) grep -oper restituire la parte corrispondente (più righe di awko sedfare lo stesso)
  • (non standard) grep -A/B/Cper restituire il contesto intorno alla partita (ancora doloroso fare in modo simile con sedo awk)

sed

  • s/foo/bar/: sedil scomando ha caratteristiche che sono difficili da implementare awkcome:
  • 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

perlcome 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/ awkobsoleto).

Padroneggiare perlper eseguire l'elaborazione del testo offre un serio vantaggio. Consiglierei di passarci un po 'di tempo, anche prima di guardare i sedcomandi 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 grepo sedimplementazioni 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 ...


Risposta eccellente! Conosci l'efficienza degli strumenti? Sono confuso riguardo alla dichiarazione del PO, che awkè molto più veloce di grep.
pfnuesel,

@pfnuesel, dipende molto dall'implementazione e dal modello di utilizzo. Ad esempio, mawkè noto per essere molto efficiente (ma non supporta i caratteri multibyte che è parte del motivo per cui è più efficiente di altri strumenti)
Stéphane Chazelas,
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.