Coloriser des flux de texte avec colout

Posté par  (site web personnel, Mastodon) . Édité par Benoît Sibaud. Modéré par claudex. Licence CC By‑SA.
65
4
avr.
2013
Ligne de commande

Les réalisateurs de films policiers ne s'y trompent pas : lire des flux de textes en ligne de commande nécessite parfois le super pouvoir de lisibilité.

Bien que les outils GNU soient extrêmement pratiques pour manipuler des flux de texte, il en manquait un pour aider à mettre en valeur l'information importante, sans masquer l'accessoire. Par exemple pour faciliter la lecture de logs s'étendant sur plusieurs lignes ou pour détecter rapidement le numéro de ligne d'un fichier responsable d'une erreur de compilation.

Heureusement, grâce à la commande colout (aujourd'hui en version 1.0), vous pouvez maintenant très facilement coloriser colorer colorier mettre de la couleur là où vous le souhaitez dans votre ligne de commande.

Basiquement, colout s'utilise comme un filtre de flux de texte classique, généralement après un pipe, et mets en valeur les bouts de texte correspondant à une expression régulière avec une couleur et un style de votre choix :

    <flux de texte> | colout <expression régulière> [couleur [style]]

L'IHM de colout est pensée pour être simple tout en permettant des utilisations vraiment intéressantes, telles que le coloriage l'application des couleurs sur les groupes des expressions, l'utilisation de cartes de couleurs (mais si, vous savez, les couleurs de l'arc-en-ciel…), la coloration la mise en valeur de la syntaxe de code source, des thèmes automatiques et même l'application d'une couleur en fonction de la valeur d'un nombre.

Pour ceux qui utiliserait déjà la concurrence, n'hésitez pas à comparer le rendu de colorgcc avec le thème correspondant de colout (ici avec le colorisationnage thème CMake en bonus).

Notez également que le système de thèmes de colout permet de faire la même chose que ccze ou colordiff (et d'autres choses encore) avec une seule commande.

Par contre, l'approche de colout est différente de celle de cw, qui permet de colorouiller mettre en couleur des applications interactives (mais nécessite des fichiers de configuration abscons), là où colout s'insère dans le flux de texte.

L'application la plus proche de colout est sans doute colorit, mais vous devez préparer à l'avance vos colorations schémas de couleurs dans un fichier de configuration (en… m4, bon courage).

Heureusement, colout est écrit en python et est distribué sous licence GPLv3.

Aller plus loin

  • # Outil intéressant

    Posté par  (site web personnel) . Évalué à 10.

    L'outil semble très intéressant.

    Dans le même genre mais en inutile, j'aime beaucoup lolcat qui permet de colorier en arc-en-ciels les flux de texte.

  • # Blague

    Posté par  . Évalué à 9.

    En tout cas, tous ces colorouillages coloration blague sur les mots m'ont bien fait rire.

    « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

    • [^] # Re: Blague

      Posté par  (site web personnel) . Évalué à 2.

      Dans mon lecteur RSS les mots barrés s'affichaient normalement, j'ai trouvé ça très bizarre du coup…

  • # PKGBUILD

    Posté par  . Évalué à 7. Dernière modification le 05 avril 2013 à 00:04.

    J'adore ! J'utilisais déjà colordiff pour les diff et des alias pour activer la couleur sur pas mal de commandes, mais il me manquait un truc pour les fichiers de log.

    Pour ceux qui sont sous archlinux, je viens de bricoler un PKGBUILD vite fait dans AUR :

    yaourt -S colout-git
    
    

    Au passage, quelqu'un a-t-il une solution pour convertir un texte colorisé dans un terminal vers un format exploitable ailleurs ? Genre qui convertirait les caractères de contrôle du terminal en balises HTML par exemple ?

  • # ccze

    Posté par  . Évalué à 5.

    Perso, j'utilise ccze qui fait bien la job.

    • [^] # Re: ccze

      Posté par  . Évalué à 2.

      ccze m'a l'air spécialisé dans certains démon et orient colonnes plutôt que ligne.
      ces deux outils seraient alors très complémentaires.

  • # ack

    Posté par  (site web personnel) . Évalué à 3.

    J'ai découvert, pas plus tard qu'hier, ack: http://betterthangrep.com/

    Testé et approuvé ;).

    • [^] # Re: ack

      Posté par  . Évalué à 1.

      Ce domaine…

    • [^] # Re: ack

      Posté par  . Évalué à 2.

      ack c'est un grep --color qui évite les fichiers de versionning, donc pas vraiment le même objectif.

      • [^] # Re: ack

        Posté par  . Évalué à 2.

        J'aurais plutôt dis un :

        grep --color -r "patern" dir | pager
        
        

        Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

        • [^] # Re: ack

          Posté par  . Évalué à 0.

          ploc

          Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

    • [^] # Re: ack

      Posté par  . Évalué à 2.

      Il te faut dans ce cas ag (better than ack):
      https://github.com/ggreer/the_silver_searcher

      En gros une réimplémentation en C de ack. Très rapide.

  • # grep

    Posté par  . Évalué à 2.

    À part les trucs funs comme l'arc en ciel, je ne vois pas vraiment d'usage « utile » :-/
    Je pense qu'un grep --color suffit largement à mettre en valeur ce qu'on cherche (avec l'alias qui va bien).

    Mais bon, c'est quand meme un projet sympa :-)

    Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

    • [^] # Re: grep

      Posté par  (site web personnel) . Évalué à 9. Dernière modification le 05 avril 2013 à 11:17.

      À part les trucs funs comme l'arc en ciel, je ne vois pas vraiment d'usage « utile » :-/

      Typiquement les droits avec des couleurs séparés par entité (user/group/everyone) :

      -rwxr-xr-x
      
      

      Quand je vois ça, mon cerveau passe un peu de temps (pas trop je vous rassure quand même) à séparer, alors qu'avec

      Titre de l'image

      Je sépare instantanément les droits de chaque entité sans effort.

      C'est pas grand chose mais pour moi, c'est tout de même relativement « utile ».

      • [^] # Re: grep

        Posté par  (site web personnel) . Évalué à 0.

        Quand je vois ça, mon cerveau passe un peu de temps (pas trop je vous rassure quand même) à séparer

        D'un côté je comprends tout à fait ton point de vue, mais d'un autre, le fait que tu aies besoin d'un peu de temps pour décomposer le code montre que ce n'est pas une activité très importante (en fréquence de répétition) pour toi: à quoi bon aller plus vite?

        Si tu passais plus de temps à lire des pâtés -rw-rw-rwx tu saurais tout par cœur sans rien décomposer du tout, un peu comme ces freaks du démineur qui en pratique ne réfléchissent plus vraiment mais connaissent par cœur toutes les arrangements 3x3 du jeu, ce qui leur permet de résoudre les grilles les plus grandes en une trentaine de secondes (déjà vu avec mes deux yeux!).

        • [^] # Re: grep

          Posté par  (site web personnel) . Évalué à 6.

          D'un côté je comprends tout à fait ton point de vue, mais d'un autre, le fait que tu aies besoin d'un peu de temps pour décomposer le code montre que ce n'est pas une activité très importante (en fréquence de répétition) pour toi: à quoi bon aller plus vite?

          Je ne cherche pas forcément à gagner en vitesse mais également en confort.

          • [^] # Re: grep

            Posté par  . Évalué à 1. Dernière modification le 06 avril 2013 à 22:37.

            Ou pour ne pas finir aveugle à 24 ans à force d’essayer de distinguer du blanc d’un autre truc blanc parmi d’autres lignes de blanc (marche aussi avec d’autres couleurs).

            Écrit en Bépo selon l’orthographe de 1990

    • [^] # Re: grep

      Posté par  . Évalué à 5.

      Il y a des exemples que je trouve intéressant, par exemple le ps aux | grep firefox | colout "^\w+\s" blue, si tu fais un grep --color, tu n'auras pas tu tout le même résultat. Ou avoir plusieurs couleurs par ligne comme ls -l ~ | colout "^(d*)-*(rwx)(rwx)(r-x)" blue,red,yellow,green.

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: grep

        Posté par  . Évalué à 3.

        Ta dernière commande ne fonctionne que si les droits sont rwxr-xr-x. Dans les autres cas, la coloration ne se fait pas

        • [^] # Re: grep

          Posté par  . Évalué à 3.

          J'ai recopié bêtement ce qu'il y avait sur le site, il faudrait évidemment écrire un truc un peu plus compliqué.

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

          • [^] # Re: grep

            Posté par  . Évalué à 2. Dernière modification le 07 avril 2013 à 11:46.

            Désolé, je n'avais pas fait gaffe que tu avais repris un des exemples du site (où il est clairement indiqué que ça ne colorise que lorsque les droits sont rwxrwxr-x).

            Du coup, voici la regexp qui colorie tous les droits (même le - qui indique l'absence du droit d'accès) :
            ls -l ~ | colout "^([d|-])([r|-][w|-][x|-])([r|-][w|-][x|-])([r|-][w|-][x|-])" blue,red,yellow,green

            • [^] # Re: grep

              Posté par  (site web personnel) . Évalué à 2.

              ls -ld /tmp /dev/sda /dev/tty /bin/su /usr/bin/X /dev/core /dev/xconsole /dev/log| ./colout.py "^([bcdlpsD-])([r-][w-][xsS-])([r-][w-][xsS-])([r-][w-][xtT-])" blue,red,yellow,green
              -rwsr-xr-x 1 root root 35200 mai 25 2012 /bin/su
              lrwxrwxrwx 1 root root 11 avril 7 10:47 /dev/core -> /proc/kcore
              srw-rw-rw- 1 root root 0 avril 7 10:47 /dev/log
              brw-rw---T 1 root disk 8, 0 avril 7 10:47 /dev/sda
              crw-rw-rw- 1 root root 5, 0 avril 7 10:47 /dev/tty
              prw-r----- 1 syslog adm 0 avril 7 10:47 /dev/xconsole
              drwxrwxrwt 13 root root 20480 avril 7 12:07 /tmp
              -rwsr-sr-x 1 root root 9508 juin 26 2012 /usr/bin/X

            • [^] # Re: grep

              Posté par  . Évalué à 4.

              Si on veut être complet ça doit être quelque chose comme ça plutôt :

              ls -l ~ | colout "^([-bcCdDlMnpPs?])([r-][w-][sStTx-])([r-][w-][sStTx-])([r-][w-][sStTx-])" blue,red,yellow,green
              
              

              Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

              • [^] # Re: grep

                Posté par  . Évalué à 10.

                Et si on veut se simplifier la vie, on peut se contenter de :

                ls -l ~ | colout "^(.)(...)(...)(...)" blue,red,yellow,green
                
                
    • [^] # Re: grep

      Posté par  (site web personnel, Mastodon) . Évalué à 7.

      L'exemple le plus frappant est la lecture d'une sortie très verbeuse, comme par exemple la sortie de gcc.

      Tu ne veux pas filtrer avec grep parce que tu peux avoir besoin de tout lire. Par contre il est pratique de pouvoir repérer très rapidement les passages qui t'intéressent (les erreurs, par exemple). Les couleurs sont un moyen très efficace de faire ça.

      C'est pour ça que j'ai commencé à faire colout, mais je me suis assez vite rendu compte que le problème se posait aussi pour plein d'autres choses (diff, logs) et même dans des cas où j'utilisais grep habituellement (grep de code source, par exemple).

      On peut se dépatouiller avec grep ou d'autres commandes dédiées (git coloré, colordiff, ccze, etc.) dans la plupart de ces cas mais je me suis vite rendu compte qu'il était très pratique d'avoir une seule commande bien pensée pour remplacer plein de façon disparates de faire moins bien.

      • [^] # Re: grep

        Posté par  . Évalué à 5.

        Tu ne veux pas filtrer avec grep parce que tu peux avoir besoin de tout lire.

        Tu as tout de meme pas mal d'options avec grep, comme -A, -B ou -C pour afficher certaines lignes avant ou après le motif, et je trouve ça déjà très puissant

        Après, il est vrai que parfois ce n'est pas suffisant, mais dans ces cas précis, vim prend le relais. Il gère par exemple la coloration des logs.

        Attention, je ne dis pas colout n'est pas utile, juste que ça me parait spécifique à des cas très particuliers.

        En tous les cas je te souhaite bon courage, et je compte bien l'essayer dès que j'ai un peu de temps (voire en faire un paquet debian si ça me plait bien :-).

        Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

        • [^] # Re: grep

          Posté par  (site web personnel) . Évalué à 2.

          Tu as tout de meme pas mal d'options avec grep, comme -A, -B ou -C pour afficher certaines lignes avant ou après le motif, et je trouve ça déjà très puissant

          … et ça peut être sublimé, avec le grisage euh, grisure grisement (pas sûr) des lignes ajoutées par ces options avec colout \o/ (c'est facile en plus, il suffit de détecter un "-" juste après le nom du fichier au lieu d'un ":", qui le fait ?)

    • [^] # Re: grep

      Posté par  . Évalué à 2.

      Un autre problème de grep est que si tu pipe plusieurs grep, tu gardes juste la colorisation du dernier, or quand je fais quelque chose comme :

      grep "bidule" | grep -v "bidule-truc"
      
      

      je voudrais bien que mes bidule soient colorés…
      Avec un coup de colout derrière j'ai ce que je veux !

      • [^] # Re: grep

        Posté par  . Évalué à 7. Dernière modification le 06 avril 2013 à 13:58.

        grep --color=always
        très pratique à combiner avec un less -R

        • [^] # Re: grep

          Posté par  . Évalué à 2.

          Merci, mais cela pose un autre un problème si je chaine mes grep comme précédemment :

          $ # Sans --color=always
          $ grep "bidule" bidule.list | grep -v "bidule-truc" | wc -l
           3
          
          $ # Avec --color=always
          $ grep --color=always "bidule" bidule.list | grep -v "bidule-truc" | wc -l
           6
          
          

          avec un fichier bidule.list qui ressemble à ça :

          bidule
          bidule-truc
          bidule
          bidule
          bidule-truc
          bidule-truc
          
          

          Les caractères d'échappement des couleurs semblent empêcher mon deuxième grep de fonctionner correctement … pas glop !

          • [^] # Re: grep

            Posté par  . Évalué à 3.

            Oui, forcément puisque ces caractère sont ajoutés à la sortie que le deuxième grep reçoit en entrée.
            Dans ton exemple il faut inverser les deux grep, comme le grep -v ne sort que les lignes qui ne correspondent pas il n'y mettra aucune couleur, l'autre peut alors travailler sans problème sur le flux resultant.
            Une autre solution est de faire tout en un seul grep, mais ça peut rapidement faire des expressions rationnelles très compliquées. Dans ton cas il faudrait activer les expressions rationnelles de type perl (-P avec GNU grep) pour pouvoir faire un «zero-width negative look-ahead» (man perlre), ce qui te donnerait l'expression suivante

            bidule(?!-truc)

            qui peut se traduire en français pas «sélectionner bidule s'il n'est pas suivi par -truc».

    • [^] # Re: grep

      Posté par  . Évalué à 3.

      à deux derrière l'écran : "regarde là, dans la ligne verte, l'erreur est là".
      seul : bah c'est joli :) et en fait ça évite de se mélanger aussi.

  • # Bien que les outils GNU soient extrêmement pratiques

    Posté par  . Évalué à 1.

    s/GNU/Unix/

  • # Option

    Posté par  . Évalué à 2.

    Ca à l'air sympathique.

    Je n'ai pas regardé dans le détails mais J'aurais aimé une option -f pour aller chercher la liste des expressions régulière couleur dans un fichier de conf

    Par ex :

    cat mylog.log | colout -f montheme.cfg 
    
    
    • [^] # Re: Option

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      C'est ce que fait l'option -t avec les fichiers de thème.
      Un thème est une fonction qui renvoie une liste de la forme :

      [
          ["regexp1", "couleur1,couleur1", "style"],
          ["regexp2"] # couleur et style par défaut
      ]
      
      

      Voir les fichiers colout_*.py pour des exemples.

    • [^] # Re: Option

      Posté par  (site web personnel) . Évalué à 10.

      cat mylog.log | colout -f montheme.cfg 
      

      UUOC.

    • [^] # Re: Option

      Posté par  . Évalué à 2. Dernière modification le 09 avril 2013 à 20:19.

      cat mylog.log | colout -f montheme.cfg

      J’utilise lwatch du paquet lwatch avec un fichier de conf du style :

      date_color=cyan
      host_color=magenta
      serv_color=blue
      mesg_color=lightgray
      
      input_file=-
      output_file=-
      
      show_unparsed=no
      
      /\[[0-9]+\.[0-9]+\]/ highlight=brown
      
      /root/                          highlight=brown
      /session closed for user root/  ignore
      
      /accept\w*/     color=green
      /success\w*/    highlight=green
      /sent/          highlight=green
      
      /failed/        color=red
      /reject\w*/     highlight=red
      /lost/          highlight=red
      
      /deferred/      highlight=brown
      
      

      Exemple : tail -f /var/log/auth.log | lwatch.

  • # app-misc/grc

    Posté par  . Évalué à 2.

    $ cat .lessfilter
    case "$1" in
    *.log) which grc &> /dev/null && grcat conf.log < "$1" ;;
    # [...]
    esac
    exit 0

    (app-misc/grc, GPLv2, http://kassiopeia.juls.savba.sk/~garabik/software/grc.html)

  • # Colorer du texte sur la sortie standard en python

    Posté par  (site web personnel) . Évalué à 3.

    Je suis tombé récemment sur un bout de code permettant de facilement colorer du texte sur la sortie standard.

    https://gist.github.com/martin-ueding/4007035

    print('{red}ERROR{reset} {orange}All your base are belong to us!{reset}'.format(**_c))
    
    

    J'ai trouvé ça utile pour les quelques utilitaires que je développe pour la console.

  • # integration

    Posté par  . Évalué à 1.

    Comment intégrer ce genre de programmer pour que ça soit utiliser intelligement mais sans devoir rajouter à toutes ses commandes un "| colout blabla" ?

    Un alias sur certaine commande?
    Dans un script (mais si la commande n'est pas dispo sur certain environement?)

    • [^] # Re: integration

      Posté par  (site web personnel, Mastodon) . Évalué à 1.

      Une fonction ou un alias, par exemple j'utilise ça pour colorer une sortie de build cmake/g++ :

      function cm()
      {
          $@ 2>&1 | colout -t cmake | colout -t g++
      }
      
      

      Ça s'utilise simplement :

      cm ./build_script
      
      

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.