Domanda grep un file, ma mostra diverse linee circostanti?


mi piacerebbe grep per una stringa, ma mostra anche le cinque righe precedenti e le cinque righe seguenti oltre alla riga corrispondente. Come potrei essere in grado di fare questo?


2746
2017-08-12 17:55


origine


risposte:


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

grep -B 3 -A 2 foo README.txt

Se si desidera lo stesso numero di linee prima e dopo è possibile utilizzare -C num.

grep -C 3 foo README.txt

Questo mostrerà 3 righe prima e 3 righe dopo.


3665
2017-08-12 17:57



-A e -B funzionerà, come sarà -C n (per n linee di contesto), o semplicemente -n (per n linee di contesto).


520
2017-08-12 17:59



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


66
2017-09-07 11:13



grep astring myfile -A 5 -B 5

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


32
2017-08-12 17:58



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 a riferimento la pagina man di grep molto perché c'è così tanto che puoi fare con esso.

man grep

Molti strumenti GNU hanno anche un pagina di informazioni che potrebbe avere più informazioni utili oltre alla pagina man.

info grep

16
2017-08-12 18:42



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;

8
2017-10-08 00:21



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

5
2018-01-12 11:25



ripgrep

Se ti interessa la performance, usa ripgrep che ha sintassi simile a grep, per esempio.

rg -C5 "pattern" .

-C, --context NUM - Mostra NUM linee prima e dopo ogni partita.

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

Lo strumento è costruito sopra Il motore regex di Rust che lo rende molto efficiente sui grandi dati.


2
2018-04-11 10:28