grep un file, ma mostrano diversi circostante linee?
-
08-06-2019 - |
Domanda
Vorrei grep
per una stringa, ma mostrano anche i precedenti cinque righe e cinque linee di corrispondenza linea.Come potrei essere in grado di fare questo?
Soluzione
Per BSD o GNU grep
è possibile utilizzare -B num
per impostare il numero di righe prima della partita e -A num
per il numero di righe dopo la partita.
grep -B 3 -A 2 foo README.txt
Se si desidera che lo stesso numero di righe prima e dopo si può utilizzare -C num
.
grep -C 3 foo README.txt
Questo mostrerà 3 righe e 3 righe dopo.
Altri suggerimenti
-A
e -B
funzionano, come si -C n
(per n
linee di contesto), o semplicemente -n
(per n
linee di contesto...fintanto che n va da 1 a 9).
ack funziona con argomenti simili, come grep, e accetta -C
.Ma di solito è meglio per la ricerca attraverso il codice.
grep astring myfile -A 5 -B 5
Che grep "myfile" per "astring", e mostra 5 righe prima e dopo ogni partita
Io di solito uso
grep searchstring file -C n # n for number of lines of context up and down
Molti degli strumenti come grep, inoltre, hanno davvero grande uomo dei file di troppo.Mi trovo in riferimento a grep pagina man un sacco di perché c'è così tanto si può fare con esso.
man grep
Molti strumenti GNU hanno anche un pagina info che possono avere più informazioni utili, oltre alla pagina man.
info grep
Ricerca per "17655" in "/some/file.txt" che mostra i 10 linee di contesto prima e dopo (usare Awk), uscita preceduto con la linea seguita dai due punti.Utilizzare questo su Solaris quando 'grep' non supporta il "-[ACB]" opzioni".
awk '
/17655/ {
for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
print before[i]
}
print (NR ":" ($0))
a = 10
}
a-- > 0 {
print (NR ":" ($0))
}
{
before[b] = (NR ":" ($0))
b = (b + 1) % 10
}' /some/file.txt;
Usare grep
$ grep --help | grep -i context
Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM
ripgrep
Se ti interessano le prestazioni, utilizzare ripgrep
che ha una sintassi simile a quella di grep
, ad es.
rg -C5 "pattern" .
-C
,--context NUM
- Vedi NUM righe prima e dopo ogni partita.
Ci sono anche parametri come -A
/--after-context
e -B
/--before-context
.
Lo strumento è costruito sulla cima di La ruggine del motore regex il che lo rende molto efficiente sui dati di grandi dimensioni.
$grep thestring thefile -5
-5 ottiene 5 linee di sopra e al di sotto del match 'thestring' è equivalente a-C 5 O -5 B 5
Grep ha un'opzione chiamata Context Line Control
, è possibile utilizzare il --contect
che, semplicemente,
| grep -C 5
o
| grep -5
Dovrebbe fare il trucco
Qui è il @Ygor soluzione in awk
awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile
Nota:Sostituire a
e b
le variabili con il numero di righe prima e dopo.
E ' particolarmente utile per il sistema che non supporta del grep -A
, -B
e -C
i parametri.