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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top