Come mostrare le linee dopo ogni partita grep fino ad altre partite specifiche?


45

So che usando l' "-A NUM"interruttore posso stampare un numero specifico di righe finali dopo ogni partita. Mi chiedo solo se è possibile stampare le righe finali fino a quando non viene trovata una parola specifica dopo ogni corrispondenza. ad es. Quando cerco "Parola A" voglio vedere la riga contenente "Parola A" e anche le righe che seguono fino a quella contenente "Parola D".

contesto:

Word A
Word B
Word C
Word D
Word E
Word F

comando:

grep -A10 'Word A'

Ho bisogno di questo risultato:

Word A
Word B
Word C
Word D

Risposte:


75

Sembra che tu voglia stampare linee tra ' Word A' e ' Word D' (incluso). Ti consiglio di usare sedinvece di grep. Ti consente di modificare un intervallo di stream di input che inizia e termina con i pattern desiderati. Dovresti semplicemente dire seddi stampare tutte le linee nell'intervallo e non altre linee:

sed -n -e '/Word A/,/Word D/ p' file

Qualche consiglio su come renderlo esclusivo (per qualsiasi situazione generica, non solo per i PO)?
2

5
@ 2rs2ts per renderlo esclusivo, basta aggiungere | sed -e '1d;$d', ovvero rimuovere la prima e l'ultima riga
holroy,

E se vuoi escludere tutte le linee tra - cioè, vuoi solo vedere le linee che sono al di fuori delle due corrispondenze - quindi: sed -n -e '/pattern A/,/pattern D/d; p'Questo dice: "cancella dal modello A al modello D e stampa tutto il resto". Sfortunatamente, questa partita è golosa. Ciò significa che se i motivi A e D appaiono più di una volta, abbinerai dal primo motivo A all'ultimo motivo D. Temo che Perl o Python siano i tuoi amici, se è così.
fbicknel

16

perché non usare awk?

awk '/Word A/,/Word D/' filename

2
sed sembra essere in grado di farlo in modo molto più efficiente se sono coinvolti molti file. Awk potrebbe essere più facile da ricordare, ma sed sembra valere una nota adesiva nel mio cervello.
JimNim,

1
awk è superiore se Word Dcade sulla stessa linea di Word A, e possibilmente altrove, ad esempio Word A Word D\nWord Dcon sed mostrerà due linee dove come awk ne mostrerà una. Inoltre, è ancora possibile utilizzare le variabili con awk, ad esempio awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file", quindi sed può essere più efficiente, ma quando si tratta di ricerche di due stringhe che possono o meno rientrare nella stessa linea, awk è sicuramente più affidabile.
S0AndS0

sembra che awk gestisca meglio il caso in cui il file contenga sequenze di Ae Be tu vuoi solo catturare cosa c'è tra ciascuna di tali sequenze. sembra che sed nel mio caso non segua almeno questa semantica.
Matan,

9
perl -lne 'print if /Word A/ .. /Word D/' file

o

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
+1 per contrastare il downvote drive-by. Userei ancora sedper questo, a meno che non sia necessario il potere delle espressioni regolari Perl per selezionare le linee di delimitazione.
Tripleee

Le persone che hanno scritto sed negli anni '70 devono essere grate :-)
Matan,
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.