Utilisez des couleurs différentes pour chaque autre grep

6

Comment puis-je configurer grepafin que je puisse mettre en évidence en couleur plus intelligemment? En utilisant des couleurs différentes?

Problème: le grep --colorrouge est utilisé par défaut pour mettre en évidence les correspondances, mais il reste difficile à lire pour des analyses consécutives. Si je cours greptrois fois, j'aimerais que la première passe utilise le rouge, la seconde utilise une autre couleur (par exemple, le vert), la troisième utilise à nouveau le rouge, etc.

J'ai lu avant qu'il y ait un bidouillage pour échanger la couleur dans l'utilisation du terminal à chaque fois, afin que la sortie soit nette et plus facile à lire. Mais j'oublie ce que c'est. s'agit-il de zsh ou de bash-script, ou d'un autre shell?

Dennis C
la source

Réponses:

3

Vous pouvez ajouter les éléments suivants à votre .bashrcfichier:

my_grep() {
  if $GREP_USE_FIRST_COLOR
  then
    export GREP_USE_FIRST_COLOR=false
    export GREP_COLORS='ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=36'
  else
    export GREP_USE_FIRST_COLOR=true
    export GREP_COLORS='ms=01;33:mc=01;33:sl=:cx=:fn=35:ln=32:bn=32:se=36'
  fi
  grep --color=auto "$@"
}
alias grep=my_grep

Cela modifiera la couleur de surlignage de correspondance des grepappels suivants dans un shell interactif entre gras rouge ( ms=01;31) et jaune vif ( ms=01;33).

Consultez le manuel de grep pour plus d'informations sur l'utilisation GREP_COLORSde la définition des couleurs de surbrillance que vous aimez.

Chriki
la source
0

Inspiré par la réponse de @Chriki

En utilisant PROMPT_COMMAND comme point d'ancrage, mettez à jour GREP_COLOR et git config pour chaque invite.

# .bashrc
# ...
# your alias, git prompt, git completetion, exports... etc
# ...
__grep_swap_color ()
{
  if [ -z "$GREP_COLOR" ]
  then
    export GREP_COLOR='1;32'
    git config --global color.grep.match blue
  else
    export GREP_COLOR=''
    git config --global color.grep.match red
  fi
}
PROMPT_COMMAND=$PROMPT_COMMAND';__grep_swap_color'
# End of file
Dennis C
la source
1
Merci de m'avoir inspiré :-) Merci de me signaler quelques inconvénients de votre solution: (1) Vous ne pourrez pas modifier la couleur lorsque vous exécutez une autre commande shell entre deux exécutions de grep ou lorsque vous appuyez simplement sur Entrée après. une course de grep; (2) Votre solution est un peu chère car elle exécute pas mal de code à chaque nouvelle invite; (3) Votre bash se plaindra à chaque invite quand PROMPT_COMMANDn'est pas défini car la commande d'invite commencera par un ;; (4) GREP_COLORest obsolète .
Chriki
0

Vous recherchez un moyen simple de colorer des lignes de sortie alternatives dans bash .

Si la réponse semble un peu déroutante, suivez ceci.

  1. Vous devez utiliser un script qui le fait automatiquement pour vous. Ouvrez "terminal". (Dans de nombreuses variantes d'Ubuntu et de lui-même, vous appuyez sur Alt+ Ctrl+ Tpour l'invoquer.) Je suppose que vous utilisez Ubuntu.
  2. Utilisez votre éditeur préféré pour ouvrir un fichier texte pour écrire le script. J'utilise 'nano'. Comme ça nano ~/grepc.sh. Cela ouvre un fichier appelé grepc.shdans mon / home ( ~/).
  3. Collez ce script bash dans cela.

    #!/bin/sh
    while read line
    do
      echo -e '\e[1;31m'"$line"
      read line
      echo -e '\e[1;32m'"$line"
    done
    echo -en '\e[0m'
    
  4. Si vous êtes dans nano, appuyez sur Ctrl+ Xpour essayer de fermer nano, mais avant cela, il vous sera demandé si vous souhaitez enregistrer le fichier. Faites-le en appuyant sur y sur votre clavier.

  5. Maintenant, vous devez rendre ce script exécutable. Tapez la commande chmod +x ~/grepc.sh.
  6. C'est tout. Maintenant, utilisez ceci avec les commandes grep comme ceci: ls ~/ | grep "test" | ./grepc.sh(En supposant que la commande soit exécutée dans / home).
Irréaliste
la source
Je pense que vous avez mal lu ma question.
Dennis C
0

Ceci est une adaptation de la solution de Kimvais (qu'Unrealist a également utilisée). Créer grepc.bash:

while read line
do
     echo "$line"
     read line && echo "$line" | sed $'s/\(\e\[\([0-9]+;\))*\)31m/\\132m/g'
done

Ceci utilise sedpour changer la séquence d'échappement pour le rouge en séquence d'échappement pour le vert dans les lignes alternées de son entrée. Utilisez, par exemple, comme

grep --color = toujours (peu importe) (peu importe) | (chemin du script) /grepc.bash

Il semble que la grep --colorcouleur n’est utilisée que si elle écrit sur le terminal (fenêtre), et vous devez l’utiliser =alwayspour qu’elle utilise la couleur lorsqu’elle écrit sur un tuyau. Et BTW, il est classique de placer des utilitaires personnels comme celui-ci dans ~/bin, puis de l'ajouter à votre PATH, vous n'avez donc pas besoin de le spécifier lorsque vous exécutez l'utilitaire.

Scott
la source
Je ne demandais pas à chaque autre ligne, mais à chaque autre course
Dennis C