grep un file, ma mostra diverse linee circostanti?

Vorrei grep per una stringa, ma anche mostrare le cinque righe precedenti e le seguenti cinque righe, nonché la linea corrispondente. Come potrei essere in grado di fare questo?

Per BSD o GNU grep puoi usare -B num per impostare quante righe prima della partita e -A num per il numero di righe dopo la partita.

 grep -B 3 -A 2 foo README.txt 

Se vuoi lo stesso numero di linee prima e dopo puoi usare -C num .

 grep -C 3 foo README.txt 

Questo mostrerà 3 righe prima e 3 righe dopo.

-A e -B funzioneranno, così come -C n (per n linee di contesto), o solo -n (per n linee di contesto).

ack funziona con argomenti simili a grep e accetta -C . Ma di solito è meglio per la ricerca attraverso il codice.

 grep astring myfile -A 5 -B 5 

Ciò significa “myfile” per “astring” e mostra 5 righe prima e dopo ogni match

Io normalmente uso

 grep searchstring file -C n # n for number of lines of context up and down 

Molti degli strumenti come grep hanno anche file veramente grandiosi. Mi trovo spesso a riferirmi alla pagina man di grep perché c’è così tanto che puoi farci.

 man grep 

Molti strumenti GNU hanno anche una pagina di informazioni che può avere più informazioni utili oltre alla pagina man.

 info grep 

Cerca “17655” in “/some/file.txt” che mostra 10 linee di contesto prima e dopo (usando Awk), output preceduto da un numero di riga seguito da due punti. Usalo su Solaris quando “grep” non supporta le opzioni “- [ACB]”.

 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; 

Usa 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 interessa il rendimento, usa ripgrep che ha syntax simile a grep , ad es

 rg -C5 "pattern" . 

-C , --context NUM – Mostra NUM righe prima e dopo ogni incontro.

Ci sono anche parametri come -A / --after-context e -B / --before-context .

Lo strumento è costruito sulla base del motore regex di Rust che lo rende molto efficiente sui grandi dati.

Ecco la soluzione di @Ygor 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 le variabili b con il numero di linee prima e dopo.

È particolarmente utile per sistemi che non supportano i parametri grep -A , -B e -C .