Vorrei grep
una stringa, ma mostra anche le cinque righe precedenti e le cinque righe seguenti, nonché la riga corrispondente. Come potrei farlo?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Vorrei grep
una stringa, ma mostra anche le cinque righe precedenti e le cinque righe seguenti, nonché la riga corrispondente. Come potrei farlo?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Risposte:
Per BSD o GNU grep
puoi usare -B num
per impostare quante linee prima della partita e -A num
per il numero di linee dopo la partita.
grep -B 3 -A 2 foo README.txt
Se vuoi lo stesso numero di righe prima e dopo puoi usarlo -C num
.
grep -C 3 foo README.txt
Questo mostrerà 3 righe prima e 3 righe dopo.
-A
e -B
funzionerà, come -C n
(per le n
linee di contesto), o semplicemente -n
(per le n
linee di contesto ... fintanto che n è da 1 a 9).
-n
formato e ho scoperto che funziona solo fino a 9
. Perché 15
restituisce 5 righe
-A
, -B
o -C
). Di solito, l'identificatore di opzione è seguito da un valore ( -o a.out
per specificare il file di output in GCC), ma può anche funzionare come un semplice switch / flag ( -g
per abilitare le informazioni di debug in GCC). Tuttavia, gli spazi tra le opzioni sono facoltativi, quindi per le opzioni senza un valore è possibile unirle ( -ABC
), il che significa che -15
viene interpretato -1 -5
(due opzioni separate) e -5
sostituisce il -1
.
ack funziona con argomenti simili a grep e accetta -C
. Ma di solito è meglio per la ricerca attraverso il codice.
grep
: non è sicuro usarla per "pubblicizzare" ack
(che è davvero un ottimo strumento) è una buona idea ...
grep astring myfile -A 5 -B 5
Questo farà "myfile" per "astring" e mostrerà 5 righe prima e dopo ogni incontro
Io normalmente uso
grep searchstring file -C n # n for number of lines of context up and down
Molti strumenti come grep hanno anche file man davvero fantastici. Mi trovo a riferirmi molto alla pagina man di grep perché c'è così tanto che puoi farci.
man grep
Molti strumenti GNU hanno anche una pagina informativa che può contenere informazioni più utili oltre alla pagina man.
info grep
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
Cerca "17655" in "/some/file.txt" che mostra il contesto di 10 righe prima e dopo (usando Awk), l'output è preceduto dal 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;
ripgrep
Se ti preoccupi delle prestazioni, usa ripgrep
una sintassi simile a grep
, ad es
rg -C5 "pattern" .
-C
,--context NUM
- Mostra NUM righe prima e dopo ogni corrispondenza.
Ci sono anche parametri come -A
/ --after-context
e -B
/ --before-context
.
Lo strumento è basato sul motore regex di Rust che lo rende molto efficiente per i dati di grandi dimensioni.
Ecco la soluzione @Ygor inawk
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: Sostituisci a
e b
variabili con il numero di righe prima e dopo.
E 'particolarmente utile per il sistema che non supporta di grep -A
, -B
e -C
parametri.