Non c'è niente di sbagliato nelle due risposte precedenti, ma ho pensato di farti sapere che trovare la terza riga dopo uno schema può essere fatto in un singolo sed
chiama:
sed -n "/four/ { n; n; p }" SourceData.txt
Poiché un singolo programma fa il lavoro, questo è più efficiente rispetto all'esecuzione di più filtri. Il comando precedente emette la terza riga dopo ogni istanza di "four", tranne quando ciò si verifica nuovamente in una delle due righe successive a una corrispondenza (anche le altre soluzioni non gestiscono questo caso nel modo previsto); inoltre, non viene generato alcun output se il modello si trova nell'ultima o nella penultima riga del file, che potrebbe essere o meno ciò che desideri.
Per abbinare solo la prima istanza:
sed -n "/four/ { n; n; p; q }" SourceData.txt
(Nota che questa risposta è il più efficiente possibile, terminando la scansione non appena viene trovata la corrispondenza.)
Aggiungo questa soluzione perché vale la pena conoscere sed
e, nonostante la sua sintassi piuttosto scoraggiante (le espressioni regolari sono già abbastanza brutte!), spesso può essere estremamente utile. Questo tutorial è una buona introduzione.
Questa soluzione stampa la riga corrente se c'era una corrispondenza due righe fa. È leggermente diverso da poche altre risposte perché non perderà un'altra corrispondenza anche se si verifica subito dopo la corrispondenza precedente.
awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'
Ogni volta che c'è una corrispondenza, le informazioni vengono memorizzate in t[0]
. Con ogni riga il t
l'array viene spostato (incluso lo spostamento t[-1]
a t[0]
per reimpostare il valore di t[0]
). La riga viene stampata se l'array indica che c'era una corrispondenza due righe fa.
Puoi facilmente impostare un ritardo diverso (ad es. delay=7
) o utilizzare un altro modello (ad es. /sda[[:digit:]]/
)
Puoi usare questa espressione (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
L'output è:
six 6
Il grep
l'opzione "-A 2" indica che vengono emesse due righe dopo la riga corrispondente.
E il tail
l'opzione "-n 1" indica che solo l'ultimo 1
vengono restituite le righe di questo risultato.