Come posso evidenziare le partite usando GNU grep?


18

Ho visto su alcuni Linux, grepconfigurato per evidenziare la corrispondenza e stampare il file corrispondente.

Come posso configurare grepper evidenziare le partite?

Risposte:


10
alias cgrep='grep -nR --color'

Uso:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

Anche uno dei miei preferiti:

$ pgrep some-hanging-process

elencherà tutti i pid di processi che corrispondono al nome di alcuni processi sospesi che è possibile utilizzare nella seguente situazione:

$ kill $(pgrep some-hanging-process)

12
c'è un comando pkill per l'ultimo
diega

1
Con le versioni recenti di GNU grep, in grep -rgenere dovrebbe essere preferito rispetto grep -Ral primo perché non attraversa i collegamenti simbolici.
Stéphane Chazelas,

19

Ho scoperto che il modo migliore per fare il magnaccia grep è usare ack , che è essenzialmente grep ricorsivo con un elenco di ignori intelligente (ad esempio, non cerca directory .svn, ignora i file di backup, ecc.), L'evidenziazione dei colori dei risultati e perl regexps. È quello che vuoi che grep faccia il 98,6% delle volte.


5
+1 per menzionare ack. Non dimenticare di includere l'opzione --pager = "less -R" per mantenere la messa in evidenza dei risultati impaginati. Potrebbe anche valere la pena ricordare che su Ubuntu viene chiamato "ack-grep" poiché viene preso "ack".
Shawn Chin,

Uso anche ack, ma a volte non ce l'hai a disposizione ..
elmarco,

2
Poiché ack è solo uno script perl, puoi renderlo disponibile ovunque tu abbia installato perl, che non è una barra alta.
Kai,

Ack è buono per le sue impostazioni predefinite, ma nel tempo necessario per l'installazione di ack, avresti potuto configurare alcune impostazioni predefinite per grep - vedi la mia risposta altrove in questa pagina. L'ho fatto una volta negli anni '80 e da allora grep ha fatto tutto ciò che fa. (solo grep è in realtà più veloce, nonostante le forti dichiarazioni contrarie di ack)
Jonathan Hartley,

7

Ho impostato questo nel mio .bashrc, invece di ridefinire grep usando un alias:

    export GREP_OPTIONS="--color=auto"

Per me, questo funziona su Linux, MacOSX e FreeBSD.


GREP_OPTIONSdovrebbe essere considerato dannoso. Consiglio aliasinvece di usare . Vedi qui: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

Sono d'accordo che GREP_OPTIONS può essere un problema in alcuni script. Ma come ho sostenuto nel bug 67141 , GREP_OPTIONS consente all'utente di impostare un'opzione per molte forme di grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep, ecc.), Mentre dovrà essere impostato un alias per ogni forma di * grep e ci sono molti tipi di grep.
Stefan Lasiewski,

Usavo GREP_OPTIONS per anni (anzi, decenni) ma il danno che provoca è molto reale. Tutti gli strumenti che invocano grep con questo set di env var erediteranno il tuo comportamento predefinito modificato, e questo romperà quegli strumenti. Evita completamente questo problema definendo invece un alias o uno script wrapper eseguibile.
Jonathan Hartley,

Gli script devono disinfettare il loro ambiente. Nessun se, ma, o howevers consentito. Periodo. (Sì, è un dolore reale nella parte bassa della schiena ...).
vonbrand

3

Consiglierei di evitare la variabile d'ambiente GREP_OPTIONS, influenzerà ogni invocazione di grep, anche quelle incorporate in altri strumenti. Se quegli strumenti si aspettano che grep si comporti in un modo, e tu cambi quel comportamento, lo farà e romperà quegli strumenti.

Invece, puoi creare un alias, che funziona bene. Questo influenzerà solo le chiamate a grep dalla tua shell interattiva (cioè che digiti te stesso).

L'ultima opzione, che mi piace soprattutto, è quella di creare uno script wrapper che invochi grep. Preferisco questo rispetto ad un alias, perché posso invocare questo wrapper da altri programmi. Ad esempio in vim impostando vimgrep, in modo che le mie ricerche all'interno di vim si comportino in modo identico alle ricerche sulla riga di comando.

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

Richiamalo usando:

$ grp pattern dir

per esempio

$ grp pattern .

cercherà le istanze di 'pattern' in tutti i file di testo nella directory e nei sottodir correnti.

Notate che chiamo il mio script 'grp', anziché oscurare 'grep', in modo da essere sempre consapevole del fatto che sto invocando grep con i miei valori predefiniti personalizzati o meno.

Per impostazione predefinita includo:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

Penso che tutti vorrebbero saltare le dirs di controllo del codice sorgente: .hg .git .bzr .svn

Saltare 'build' e 'dist' sono python-ismi e probabilmente non si applicano alla maggior parte delle persone. Senza dubbio svilupperai le tue idiosincrasie mentre lavori.

'tags' è l'output di ctags, che uso per 'vai alla definizione della funzione' e simili in strumenti come vim. Come tale contiene almeno una copia di ogni parola e simbolo dal mio codice sorgente, quindi vale la pena saltare dai risultati della ricerca.

"$ *" alla fine è la sintassi bash per "e tutti gli altri parametri dalla riga di comando", quindi puoi passare il modello e la directory per cercare normalmente e sovrascrivere qualsiasi altro flag della riga di comando che desideri .


2

L' --coloropzione è stata già menzionata più volte, ma vorrei aggiungere che è possibile configurare il colore con cui verranno evidenziate le corrispondenze utilizzando una variabile di ambiente

export GREP_COLOR="1;33"

Il colore deve essere codificato utilizzando i codici colore ANSI, come riferimento

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

1
GREP_COLORè deprecato. Usa GREP_COLORSinvece.
g33kz0r,

2

Dal momento che non ho visto alcun esempio di impostazione dei colori, ecco una semplice configurazione per GNU grep:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

Stai attento GREP_OPTIONS; non usarlo per nient'altro che cose del genere --color=autoo rovinerà qualsiasi script che utilizza grep sul tuo sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.