GNU/Linux >> Linux Esercitazione >  >> Linux

Stampa la riga di corrispondenza e l'ennesima riga dalla riga di corrispondenza?

Sto cercando di stampare la riga abbinata e la 4a riga dalla riga abbinata (riga contenente l'espressione che sto cercando).

Ho utilizzato il seguente codice:
sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt

Ma questo stampa solo la linea abbinata.

Viene stampata solo la 4a riga.
awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt

Devo stampare solo la riga corrispondente e la 4a riga.

Risposta accettata:

In awk, lo faresti come segue

awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`

o

awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`

Spiegazione

La prima soluzione trova tutte le righe che corrispondono a pattern . Quando trova una corrispondenza, memorizza il numero del record (NR ) nell'array nr . Memorizza anche il 4° record da NR nella stessa matrice. Questo viene fatto dal nr[NR+4] . Ogni record (NR ) viene quindi verificato per vedere se è presente nel nr array, in tal caso il record viene stampato.

La seconda soluzione funziona essenzialmente allo stesso modo, tranne quando incontra il pattern stampa quella riga e quindi memorizza il 4° record prima di esso nell'array nr , quindi passa al record successivo. Quindi quando awk incontra questo 4° record il NR in nr il blocco verrà eseguito e successivamente verrà stampato questo record +4.

Esempio

Ecco un file di dati di esempio, sample.txt .

$ cat sample.txt 
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16

Utilizzando la prima soluzione:

$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt 
4 blah
8
10 blah
14

Utilizzando la 2a soluzione:

$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt 
4 blah
8
10 blah
14

Linux
  1. Report di I/O dalla riga di comando di Linux

  2. Manipolare il tasto X e il puntatore sulla riga di comando?

  3. Trap, Err, e facendo eco alla linea di errore?

  4. Trova la versione di WordPress dalla riga di comando

  5. Come posso fare in modo che grep stampi le righe sotto e sopra ogni riga corrispondente?

Invia e ricevi Gmail dalla riga di comando di Linux

Programma hardware dalla riga di comando di Linux

Ohcount - Il contatore e l'analizzatore di linee di codice sorgente

Come spegnere Debian 10 dalla riga di comando e dalla GUI

Come abilitare e disabilitare le estensioni di Gnome dalla riga di comando?

MySQL la riga di comando e i cercapersone