it-swarm-eu.dev

Come stampare 5 linee consecutive dopo un pattern nel file usando awk

Vorrei cercare un motivo in un file e stampare 5 righe dopo aver trovato quel modello.

Ho bisogno di usare awk per fare questo.

Esempio: 

Contenuto del file:

.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.

Come analizzo un file e stampo solo le righe sopra menzionate? Uso NR della riga che contiene "PATTERN" e continuo ad incrementare fino a 5 e stampare ogni riga nel processo . so se ci sono altri wat efficienti per farlo in Awk.

35
tomkaith13

Un altro modo per farlo in AWK:

awk '/PATTERN/ {for(i=1; i<=5; i++) {getline; print}}' inputfile

in sed:

sed -n '/PATTERN/{n;p;n;p;n;p;n;p;n;p}' inputfile

o

sed -n '1{x;s/.*/####/;x};/PATTERN/{:a;n;p;x;s/.//;ta;q}' inputfile

I caratteri # rappresentano un contatore. Utilizzare uno meno del numero di linee che si desidera produrre.

49
awk '
{ 
    if (lines > 0) {
        print;
        --lines;
    }
}

/PATTERN/ {
    lines = 5
}

' < input

Questo produce:

#Line1
#Line2
#Line3
#Line4
#Line5
14
Johnsyweb

grep "PATTERN" search-file -A 5 farà il lavoro per te se decidi di dare una possibilità a grep.

Modifica: puoi chiamare anche grep usando la funzione system() dal tuo script awk.

11
anubhava

Modifica: non ha notato PATTERN non dovrebbe essere parte dell'output.

cat /etc/passwd | awk '{if(a-->0){print;next}} /qmaild/{a=5}'

o

cat /etc/passwd | awk ' found && NR-6 < a{print} /qmaild/{a=NR;found=1}'

Il più breve che riesco a trovare è:

cat /etc/passwd | awk 'a-->0;/qmaild/{a=5}'

Leggi come a tende a 0./qmaild/imposta da a a 5 :-)

7
ninjalj

awk per il salvataggio!

stampare con la linea del motivo (totale 6 righe)

$ awk '/^####PATTERN/{c=6} c&&c--' file

####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5

saltare il modello e stampare le successive cinque righe

$ awk 'c&&c--; /^####PATTERN/{c=5}' file

#Line1
#Line2
#Line3
#Line4
#Line5
5
karakfa

Soluzione rapida e sporca: awk '/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'

0
gelraen

Limitata come la soluzione di Johnsyweb ma utilizzando un approccio diverso e GNU la caratteristica avanzata di awk permette ai separatori di record RegEx completi di ottenere un pezzo di codice che, IMHO, è molto awk- ish:

awk -F\\\n '{NF=5}NR-1' RS="PATTERN[^\n]*." OFS=\\\n

Quindi, se vuoi una soluzione stabile che sia anche leggibile, segui la risposta di Dennis Williamson (+1 per quella) ma forse anche tu semplicemente ti godi la bellezza di awk quando guardi linee come questa.

0
mschilli