Voglio "grep" dalla "riga 2A" alla fine del file:
sed -n '/2A/,$p'
- -n :sopprime
sedoutput predefinito - /2A/ :righe di output dalla prima contenente "2A"
- $ :alla fine del file
Voglio "grep" dalla "riga 2A" alla riga successiva che contiene "A":
sed -n '/2A/,/A/p'
- /A/ :output finché una riga non contiene "A"
Voglio "grep" dalla prima riga contenente "A" a quella successiva:
printf "/A\n.+1,/A/p\nq" | ed -s
$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"
$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5
$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A
$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A
(espanso dal commento)
awk ha la capacità di selezionare "intervalli" di righe che soddisfano perfettamente questa esigenza, come descritto nel manuale GNU-awk (gawk). (Questa funzione funziona in altri awk s ma il gawk manuale è facile da collegare.)
awk '/line 2A/,0' stampa le righe che iniziano con la prima che corrisponde a line 2A e continuando fino alla fine dell'input perché 0 è una condizione che non è mai vera.
awk '/line 2A/,/A/&&!/line 2A/' inizia a stampare con una riga che corrisponde a line 2A e si interrompe dopo una riga che corrisponde a A ma NON line 2A (e quindi non può essere la stessa linea della linea di partenza). Ricomincerà di nuovo su un successivo line 2A e così via; se vuoi evitare che ci siano modi leggermente più complicati per farlo.
Se le linee di arresto hanno sempre un carattere diverso da 2 prima del A questo può essere semplificato in awk '/line 2A/,/[^2]A/' che si ferma dopo una riga che corrisponde a qualsiasi carattere diverso da 2, seguito da A. Potresti desiderare una variazione di questo, ad es. fermarsi su qualsiasi A singola cifra diversa da 2A, ma non su altre A come WHAT; per questo la condizione di arresto potrebbe essere ,/line [013-9]A/ .
Penso che il modo migliore sia usare grep in combinazione con cut e tail . Per prima cosa, usa grep per ottenere la riga su cui si trova la stringa desiderata (-n per emettere il numero di riga; -m 1 per interrompere la ricerca dopo la prima corrispondenza):
grep -n -m 1 "somestring" filename.txt
Questo emette il numero di riga e la stringa stessa. Per tagliare via la stringa, usiamo cut (-f1 :uscita primo campo; -d: usa ":" come delimitatore):
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
Successivamente, usiamo l'output di questo comando come parametro in tail. Normalmente, tail stampa le ultime k righe, ma usando -n +k , otteniamo tail to print dalla riga k in poi. Il comando totale è:
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
Per emettere le righe fino a somestring usa head invece di tail e -n -# invece di -n +# . Puoi anche combinare entrambi per ottenere le linee da una stringa all'altra.