GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:grep da determinate righe alla fine del file

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.


Linux
  1. Configura un'area di lavoro Linux in remoto dalla riga di comando

  2. Lavorare con le pipe sulla riga di comando di Linux

  3. Eliminazione di righe specifiche da un file nella riga di comando di Linux

  4. Migrazione di un server Linux dalla riga di comando

  5. Linux:controlla se c'è una riga vuota alla fine di un file

Programma hardware dalla riga di comando di Linux

Copia un file in più directory dalla riga di comando su Linux

Visualizza il contenuto di un file nella riga di comando di Linux

Come trovare le righe più lunghe in un file in Linux

5 comandi per visualizzare il contenuto di un file nella riga di comando di Linux

Come contare le righe in un file in UNIX/Linux