GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire il grep per i contenuti dopo il modello?

sed -n 's/^potato:[[:space:]]*//p' file.txt

Si può pensare a Grep come a un Sed ristretto, oa Sed come a un Grep generalizzato. In questo caso, Sed è uno strumento buono e leggero che fa quello che vuoi, anche se, ovviamente, esistono anche molti altri modi ragionevoli per farlo.


grep -Po 'potato:\s\K.*' file

-P per usare l'espressione regolare Perl

-o per produrre solo la corrispondenza

\s per abbinare lo spazio dopo potato:

\K per omettere la corrispondenza

.* in modo che corrisponda al resto delle stringhe


Oppure usa le asserzioni regex:grep -oP '(?<=potato: ).*' file.txt


grep 'potato:' file.txt | sed 's/^.*: //'

grep cerca qualsiasi riga che contenga la stringa potato: , quindi, per ognuna di queste righe, sed sostituisce (s/// - sostituire) qualsiasi carattere (.* ) dall'inizio della riga (^ ) fino all'ultima occorrenza della sequenza : (due punti seguiti da spazio) con la stringa vuota (s/...// - sostituire la prima parte con la seconda parte, che è vuota).

o

grep 'potato:' file.txt | cut -d\   -f2

Per ogni riga che contiene potato: , cut dividerà la riga in più campi delimitati da spazio (-d\ - d =delimitatore, \ =carattere spazio con escape, qualcosa come -d" " avrebbe anche funzionato) e stampa il secondo campo di ciascuna di queste righe (-f2 ).

o

grep 'potato:' file.txt | awk '{print $2}'

Per ogni riga che contiene potato: , awk stamperà il secondo campo (print $2 ) che è delimitato per impostazione predefinita da spazi.

o

grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'

Tutte le righe che contengono potato: vengono inviati a un file in linea (-e ) Script Perl che prende tutte le righe da stdin , quindi, per ciascuna di queste righe, esegue la stessa sostituzione del primo esempio precedente, quindi la stampa.

o

awk '{if(/potato:/) print $2}' < file.txt

Il file viene inviato tramite stdin (< file.txt invia il contenuto del file tramite stdin al comando a sinistra) a un awk script che, per ogni riga che contiene potato: (if(/potato:/) restituisce true se l'espressione regolare /potato:/ corrisponde alla riga corrente), stampa il secondo campo, come descritto sopra.

o

perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt

Il file viene inviato tramite stdin (< file.txt , vedi sopra) a uno script Perl che funziona in modo simile a quello precedente, ma questa volta si assicura anche che ogni riga contenga la stringa potato: (/potato:/ è un'espressione regolare che corrisponde se la riga corrente contiene potato: , e, se lo fa (&& ), quindi applica l'espressione regolare descritta sopra e stampa il risultato).


Linux
  1. Come recuperare dopo che Kate si è schiantata?

  2. Come eseguire il grep con l'output a colori

  3. Come posso cercare uno schema multilinea in un file?

  4. Come eseguire il "grep" di un flusso continuo?

  5. Come verificare se un file è vuoto in Bash?

Come usare CherryTree per prendere appunti

Come Grep per più stringhe, pattern o parole

Come trovare una stringa in un file su Linux

Come reindirizzare l'output del comando della shell

Grep Come sopprimere la visualizzazione di file non corrispondenti?

grep coppie di modelli e file