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.
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.
awk '
{
if (lines > 0) {
print;
--lines;
}
}
/PATTERN/ {
lines = 5
}
' < input
Questo produce:
#Line1
#Line2
#Line3
#Line4
#Line5
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
.
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 :-)
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
Soluzione rapida e sporca: awk '/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'
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.