Commande `highlight`

11

Existe-t-il une commande qui peut être utilisée pour mettre facilement en surbrillance (avec des couleurs, du texte en gras ou un arrière / premier plan inversé) des chaînes spécifiques dans stdin tout en passant la chaîne entière à stdout? Je pense à le construire , mais je préfère simplement l'utiliser s'il existe déjà. Quelques fonctionnalités souhaitables:

  1. Les chaînes de surbrillance distinctes sont mises en surbrillance différemment, de manière automatique. Par exemple, la première chaîne sera mise en évidence en rouge, la seconde en vert, la troisième en bleu sans configuration manuelle .
  2. Détecte la prise en charge des couleurs et revient aux méthodes de mise en évidence en gras / inversé / autres lorsque celles-ci sont disponibles.
  3. Permet la correspondance d'expressions régulières et de chaînes littérales.
  4. Fait de préférence quelque chose d'intelligent si les correspondances se chevauchent, comme "foobar" et "barbar".
  5. Rien n'est modifié entre stdin et stdout à l'exception de l'ajout de codes couleur.
l0b0
la source
Ooo, bonne question. J'avais besoin de cette chose exacte et j'ai fini par écrire quelque chose, mais il ne s'agissait que de chaînes fixes à code couleur, il n'avait aucune des fonctionnalités que vous avez répertoriées
Michael Mrozek
Plutôt que d'écrire un nouvel utilitaire, ce serait super génial de voir cela comme un ajout à grep lui-même.
mattdm
1
Une bonne philosophie Unix serait un nouvel utilitaire qui peut être utilisé non seulement par grep mais aussi par d'autres flux. Je soupçonne qu'il y a au moins un ou plusieurs modules Perl qui peuvent probablement faire cela pour vous, cependant ...
Shadur
1
@ Gilles: Cette question a une portée beaucoup plus limitée. En fait, la lecture a été l'une des raisons pour lesquelles j'ai créé cette question - Pour demander une solution plus générale et plus flexible.
l0b0

Réponses:

4

Peut-être le colorant générique (grc) de Radovan Garabík ? Il attend un fichier de configuration comme argument et fonctionne avec les expressions rationnelles. Donc pas tout à fait sans configuration, mais vous pouvez utiliser la substitution de processus ( <(list)), donc certainement sans configuration manuelle :-)

artistoex
la source
Pour clarifier sans avoir besoin d'ouvrir la page (et la rendre consultable), "celui-ci" == Coloriser générique ; grc et grcat ... Merci, j'aime ça.
Peter.O
grca un script d'aide: grcat. Voici un exemple de coloration de toutes les lettres majuscules en rouge. Étape 1: Configurez le fichier de configuration: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps Étape 2; Utilisez-le: echo Hello World | grcat red-caps... La page de manuel indique 3 répertoires de configuration qu'il recherche, puis suggère (?) Que le fichier de configuration peut être un chemin absolu, mais cette dernière méthode de recherche du fichier de configuration ne fonctionne qu'avec des chemins relatifs pour moi (grc version 1.3)
Peter.O
5

Sed à la rescousse!

Vous pouvez améliorer cela (car il en a vraiment besoin) mais cela fonctionne plutôt bien.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

Par souci de simplicité, hilight accepte une paire d'arguments (d'abord la correspondance, ensuite la couleur) Dans ce script, l'attrib est toujours en gras

Lisez man console_codes (Graphic Rendition) pour voir les différences de couleurs, ou essayez ceci

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

Il présente des inconvénients importants dans l'utilisation de ces œuvres:

$ dmesg | hilight \\[ 34 ] 34

mais pas du tout:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

parce que [: digit:] trouve les nombres dans les sécuences d'échappement sur les subsitutions précédentes.

Quelque chose comme:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

fonctionnera toujours comme excepté.

En utilisant la commande de temps, j'ai trouvé cet incrément de quatre fois le temps écoulé, ce qui n'est pas trop.

Vous pouvez remplacer la commande sed par n'importe quel autre analyseur que vous aimez ou qui correspond à vos besoins (awk, etc ...)

nenopera
la source
2

On peut également utiliser egrep avec un motif qui correspond à chaque ligne sur un caractère non imprimable, comme:

dmesg | egrep --color "swap|$"
Michal Sylwester
la source
1

clide fonctionne très bien. Je l'utilise sur RHEL 6.2, depuis le dépôt EPEL

Golimar
la source
+1 pour un très bel outil. Malheureusement, il n'a pas toutes les fonctionnalités demandées.
l0b0
1

Si votre version de grepest livrée avec coloration, vous pouvez utiliser l'altération regexp pour que grep surligne le texte et corresponde également à chaque ligne afin que rien ne soit exclu. Ce qui suit devrait faire l'affaire:

<your command> |grep "highlightme\|^"
EoghanM
la source
0

Comme vous l'avez mentionné dans le lien, grep --color=alwaysne fonctionne que pour un seul motif. Cela dit, je ne crois pas qu'un tel outil existe.

Frederik Deweerdt
la source
0

J'utilise http://em.readthedocs.org/ . Facile à installer sur diverses plateformes grâce à Python. Simple et fonctionne bien.

ikalnitsky
la source
Bienvenue sur Unix et Linux Stack Exchange! Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
slm
1
Selon le centre d'aide : «Cependant, vous devez divulguer votre affiliation dans vos réponses.» Dans le cas où vous êtes le même Igor Kalnitsky qui a écrit em, veuillez reformuler votre réponse pour être clair que vous n'êtes pas un utilisateur, mais l'auteur de l'outil suggéré.
manatwork