Voglio "grep" dalla "riga 2A" alla fine del file:
sed -n '/2A/,$p'
- -n :sopprime
sed
output 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.