web-dev-qa-db-fra.com

Grep colorisé - affichage du fichier entier avec les correspondances en surbrillance

Je trouve le drapeau --color=alwaysde_lagrep_ extrêmement utile. Cependant, grep imprime uniquement les lignes avec des correspondances (à moins que vous ne demandiez des lignes de contexte). Étant donné que chaque ligne imprimée a une correspondance, la mise en surbrillance n'ajoute pas autant de capacités qu'elle le pourrait.

Je voudrais vraiment cat un fichier et voir le fichier entier avec les correspondances de motifs en surbrillance.

Existe-t-il un moyen de dire à grep d’imprimer chaque ligne lue, qu’il y ait une correspondance ou non? Je sais que je pourrais écrire un script pour exécuter grep sur chaque ligne d’un fichier, mais j’étais curieux de savoir si cela était possible avec la variable grep standard.

430
zslayton

Voici quelques façons de le faire:

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
700
Ryan Oberoi

Voici quelque chose dans le même sens. Les chances sont, vous utiliserez moins de toute façon, alors essayez ceci:

less -p pattern file

Il mettra en évidence le motif et sautera à la première occurrence de celui-ci dans le fichier. 

79
Dennis Williamson

Je voudrais recommander ack - mieux que grep, un outil de recherche puissant pour les programmeurs .

 $ ack --color --passthru --pager = "$ {PAGER: -less -R}" fichiers de motifs 
 $ ack --color --passthru pattern files | moins -R 
 $ export ACK_PAGER_COLOR = "$ {PAGER: -less -R}" 
 $ ack --passthru, fichiers de modèle 

J'adore cette méthode car elle utilise par défaut la recherche récursive dans les répertoires (et est bien plus intelligente que grep -r), prend en charge les expressions régulières Perl complètes (plutôt que POSIXish regex(3) ) et offre un affichage du contexte beaucoup plus agréable lors de la recherche de nombreux fichiers.

46
ephemient

Vous pouvez également créer un alias. Ajoutez cette fonction dans votre .bashrc (ou .bash_profile sur osx)

function grepe {
    grep --color -E "$1|$" $2
}

Vous pouvez maintenant utiliser l'alias comme ceci: "ifconfig | grepe inet" ou "grepe css index.html".

(PS: n'oubliez pas de source ~/.bashrc pour recharger bashrc sur la session en cours)

18
Fabien Sa

Vous pouvez utiliser mon script highlight à partir de https://github.com/kepkin/dev-Shell-essentials

C'est mieux que grep car vous pouvez mettre en surbrillance chaque correspondance avec sa couleur propre.

$ command_here | highlight green "input" | highlight red "output"

Screen shot from Github project

15
kepkin

Utilisez le programme colout: http://nojhan.github.io/colout/

Il est conçu pour ajouter des reflets de couleur à un flux de texte. Étant donné une expression régulière et une couleur (par exemple "rouge"), il reproduit un flux de texte avec des correspondances mises en surbrillance. par exemple:

# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile

Vous pouvez chaîner plusieurs appels pour ajouter plusieurs tons de couleur différents:

tail -f /var/log/nginx/access.log | \
    colout ' 5\d\d ' red | \
    colout ' 4\d\d ' yellow | \
    colout ' 3\d\d ' cyan | \
    colout ' 2\d\d ' green

Vous pouvez également obtenir la même chose en utilisant une expression rationnelle avec N groupes (parties de l’expression rationnelle entre parenthèses), suivie d’une liste de N couleurs séparées par des virgules.

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red
12
user2683246

J'utilise RCG de "Linux Server Hacks", O'Reilly. Il est parfait pour ce que vous voulez et peut mettre en valeur plusieurs expressions, chacune avec des couleurs différentes.

#!/usr/bin/Perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print "Usage: rcg [regex] [color] [regex] [color] ...\n";
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}
7

J'ai ajouté ceci à mes .bash_aliases:

highlight() {
  grep --color -E "$1|\$"
}
5
uronce

Pour mettre en surbrillance des motifs tout en visionnant l’ensemble du fichier, h peut le faire.

De plus, il utilise différentes couleurs pour différents motifs.

cat FILE | h 'PAT1' 'PAT2' ...

Vous pouvez également diriger la sortie de h vers less -R pour une meilleure lecture.

Pour grep et utiliser une couleur pour chaque motif, cxpgrep pourrait être un bon choix.

2
treulz

L'option -z pour grep est également assez lisse!

cat file1 | grep -z "pattern"
1
Abhishek Jaisingh

une autre manière sale:

grep -A80 -B80 --color FIND_THIS IN_FILE

J'ai fait un

alias grepa='grep -A80 -B80 --color'

à bashrc.

1
fly_a320

Ok, c'est une façon,

wc -l filename

vous donnera le nombre de lignes - dites NN, alors vous pouvez le faire

grep -C NN --color=always filename
1
nik

Voici un script qui utilise la fonction gsub d’Awk pour remplacer le texte recherché par la séquence d’échappement appropriée et l’afficher en rouge vif:

#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2

Utilisez-le comme suit:

$ ./cgrep pattern [file]

Malheureusement, il n’a pas toutes les fonctionnalités de grep.

Pour plus d'informations, vous pouvez vous référer à l'article " Donc, vous aimez la couleur " dans Linux Journal

1
Wernsey

Une autre réponse a mentionné le commutateur -CN de grep qui inclut n lignes de contexte. Je fais parfois cela avec n = 99 comme moyen rapide et sale d'obtenir [au moins] un écran plein de contexte lorsque le motif egrep semble trop complexe, ou lorsque je suis sur une machine sur laquelle je n'ai pas installé rcg et/ou ccze.

J'ai récemment découvert ccze qui est un coloriseur plus puissant. Mon seul reproche est qu'il est orienté écran (comme less, que je n'utilise jamais pour cette raison), sauf si vous spécifiez le commutateur -A pour la sortie "brute ANSI".

+1 pour la mention rcg ci-dessus. C'est toujours mon préféré car il est si simple à personnaliser dans un alias. Quelque chose comme ça se trouve généralement dans mon ~/.bashrc:

alias tailc = 'tail -f/my/app/log/file | rcg envoyer "BOLD GREEN" recevoir "CYAN" erreur "ROUGE" '

1
MarkHu

J'utilise la commande suivante à des fins similaires:

grep -C 100 searchtext file 

Cela indiquera grep pour imprimer 100 * 2 lignes de contexte, avant et après le texte de recherche mis en surbrillance. 

0
Al Mamun

Si vous voulez mettre en surbrillance plusieurs motifs de couleurs différentes, voir this script bash.

Utilisation de base:

echo warn error debug info 10 nil | colog

Vous pouvez modifier les motifs et les couleurs en cours d'exécution en appuyant sur une touche, puis sur la touche Entrée.

0
Edoot

Sinon, vous pouvez utiliser The Silver Searcher et faire

ag <search> --passthrough
0
Andrew Magee