Comment puis-je mettre en évidence des correspondances en utilisant GNU grep?


18

J'ai vu sur certains Linux, qui grepest configuré pour mettre en évidence la correspondance et imprimer le fichier correspondant.

Comment puis-je configurer greppour mettre en évidence les correspondances?

Réponses:


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

Usage:

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

Aussi l'un de mes favoris:

$ pgrep some-hanging-process

listera tous les pids des processus qui correspondent au nom de certains processus suspendus que vous pouvez utiliser dans la situation suivante:

$ kill $(pgrep some-hanging-process)

12
il y a la commande pkill pour le dernier
diega

1
Avec les versions récentes de GNU grep, grep -rdevrait généralement être préféré grep -Rcar le premier ne traverse pas les liens symboliques.
Stéphane Chazelas

19

J'ai trouvé que la meilleure façon de pimp grep est d'utiliser ack , qui est essentiellement grep récursif avec une liste d'ignorance intelligente (par exemple, ne recherche pas les répertoires .svn, ignore les fichiers de sauvegarde, etc.), la coloration des résultats et perl regexps. C'est ce que vous voulez que grep fasse 98,6% du temps.


5
+1 pour mentionner ack. N'oubliez pas d'inclure l'option --pager = "less -R" pour maintenir la mise en évidence des résultats paginés. Il convient également de mentionner que sur Ubuntu, il est appelé "ack-grep" car "ack" est utilisé.
Shawn Chin

J'utilise aussi ack, mais parfois vous ne l'avez pas disponible ..
elmarco

2
Comme ack n'est qu'un script perl, vous pouvez le rendre disponible partout où vous avez installé perl, ce qui n'est pas une barre très élevée.
Kai

Ack est bon pour ses valeurs par défaut, mais dans le temps qu'il vous faut pour installer ack, vous auriez pu configurer certaines valeurs par défaut pour grep - voir ma réponse ailleurs sur cette page. Je l'ai fait une fois dans les années 1980, et depuis lors, grep a fait tout ce que fait ack. (seul le grep est en fait plus rapide, malgré les affirmations bruyantes de ack à l'effet contraire)
Jonathan Hartley

7

J'ai défini cela dans mon .bashrc, au lieu de redéfinir grep en utilisant un alias:

    export GREP_OPTIONS="--color=auto"

Pour moi, cela fonctionne sur Linux, MacOSX et FreeBSD.


GREP_OPTIONSdevrait être considérée comme nuisible. Je recommande d'utiliser à la aliasplace. Voir ici: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

Je suis d'accord que GREP_OPTIONS peut être un problème dans certains scripts. Mais comme je l'ai expliqué dans le bogue 67141 , GREP_OPTIONS permet à l'utilisateur de définir une option pour de nombreuses formes de grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep, etc.), tandis qu'un alias devra être défini pour chaque forme de * grep, et il existe de nombreux types de grep.
Stefan Lasiewski

J'utilisais GREP_OPTIONS depuis des années (non, des décennies) mais le mal qu'il cause est bien réel. Tous les outils qui invoquent grep avec cet ensemble de variables env hériteront de votre comportement par défaut modifié, et cela cassera ces outils. Évitez entièrement ce problème en définissant un alias ou un script d'encapsuleur exécutable à la place.
Jonathan Hartley

Les scripts doivent assainir leur environnement. Aucun if, mais ou howevers permis. Période. (Oui, c'est une douleur royale dans le bas du dos ...).
vonbrand

3

Je recommanderais d'éviter la variable d'environnement GREP_OPTIONS, cela affectera chaque appel de grep, même ceux intégrés dans d'autres outils. Si ces outils s'attendent à ce que grep se comporte dans un sens, et que vous modifiez ce comportement, il cassera et cassera ces outils.

Au lieu de cela, vous pouvez créer un alias, qui fonctionne bien. Cela n'affectera que les appels à grep depuis votre shell interactif (c'est-à-dire que vous vous tapez).

La dernière option, que j'aime le plus, est de créer un script wrapper qui invoque grep. Je préfère cela à un alias, car je peux invoquer ce wrapper à partir d'autres programmes. Par exemple, dans vim en définissant vimgrep, de sorte que mes recherches à partir de vim se comportent de manière identique aux recherches sur la ligne de commande.

$ 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 $*

Appelez ceci en utilisant:

$ grp pattern dir

par exemple

$ grp pattern .

recherchera les instances de 'pattern' dans tous les fichiers texte du répertoire et des sous-répertoires actuels.

Notez que j'appelle mon script «grp», plutôt que de suivre «grep», afin que je sache toujours si j'appelle grep avec mes valeurs par défaut personnalisées ou non.

Par défaut j'inclus:

-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

Je pense que tout le monde voudrait ignorer les répertoires de contrôle de source: .hg .git .bzr .svn

Ignorer 'build' et 'dist' sont des ismes Python, et ne s'appliquent probablement pas à la plupart des gens. Vous développerez sans aucun doute vos propres idiosyncrasies pendant que vous travaillez.

'tags' est la sortie de ctags, que j'utilise pour 'go to function definition' et autres dans des outils comme vim. En tant que tel, il contient au moins une copie de chaque mot et symbole de mon code source, il vaut donc la peine de sauter de vos résultats de recherche.

"$ *" à la fin est la syntaxe bash pour "et tous les autres paramètres de la ligne de commande", vous pouvez donc passer le modèle et dir pour rechercher normalement et remplacer tous les autres drapeaux de ligne de commande que vous souhaitez .


2

L' --coloroption a déjà été mentionnée à plusieurs reprises, mais je voudrais ajouter qu'il est possible de configurer la couleur dans laquelle les correspondances seront mises en évidence à l'aide d'une variable d'environnement

export GREP_COLOR="1;33"

La couleur doit être codée à l'aide des codes de couleur ANSI, pour référence

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_COLORest obsolète. Utilisez GREP_COLORSplutôt.
g33kz0r

2

Comme je n'ai vu aucun exemple de définition de couleurs, voici une configuration simple pour 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

Soyez prudent GREP_OPTIONS; ne l'utilisez pas pour autre chose que des choses comme --color=autoou cela gâchera tous les scripts qui utilisent grep sur votre système.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.