Colored grep – Visualisation du fichier entier avec les correspondances en surbrillance

Je trouve que grep--color=always flag est extrêmement utile. Cependant, grep n’imprime que des lignes avec des correspondances (sauf si vous demandez des lignes de contexte). Étant donné que chaque ligne imprimée a une correspondance, la mise en surbrillance n’ajoute pas autant de possibilités que possible.

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

Est-ce que je peux dire à grep d’imprimer chaque ligne en cours de lecture, qu’il y ait ou non une correspondance? Je sais que je pourrais écrire un script pour lancer grep sur chaque ligne d’un fichier, mais j’étais curieux de savoir si cela était possible avec grep standard.

Voici quelques façons de le faire:

 grep --color -E 'pattern|$' file grep --color 'pattern\|$' file egrep --color 'pattern|$' file 

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 dans le fichier.

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

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

Je l’adore car il utilise par défaut la recherche récursive de répertoires (et fait beaucoup plus intelligemment que grep -r ), supporte des expressions régulières Perl complètes (plutôt que la regex(3) POSIXish regex(3) ), et affiche un contexte beaucoup plus intéressant lors de la recherche de nombreux fichiers .

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

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

Vous pouvez maintenant utiliser cet alias comme ifconfig | grepe inet : ” ifconfig | grepe inet ” ou ” grepe css index.html “.

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

Vous pouvez utiliser mon script de highlight depuis https://github.com/kepkin/dev-shell-essentials

C’est mieux que grep car vous pouvez surligner chaque match avec sa propre couleur .

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

Capture d'écran du projet Github

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

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

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

Vous pouvez enchaîner plusieurs appels pour append plusieurs couleurs différentes:

 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 

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

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

J’utilise rcg de “Linux Server Hacks”, O’Reilly. Il est parfait pour ce que vous voulez et peut mettre en évidence plusieurs expressions 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 ssortingct; 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 } 

J’ai ajouté ceci à mes .bash_aliases:

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

Ok, c’est un moyen,

 wc -l filename 

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

 grep -C NN --color=always filename 

Voici un script shell qui utilise la fonction gsub d’Awk pour remplacer le texte que vous recherchez par la séquence d’échappement appropriée pour 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 ça:

 $ ./cgrep pattern [file] 

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

Pour plus d’informations, vous pouvez vous référer à un article ” So You Like Color ” dans Linux Journal

Une autre réponse mentionnait le commutateur grep’s-c qui inclut n lignes de contexte. Je le fais parfois avec n = 99 comme un moyen rapide et sale d’obtenir [au moins] un écran de contexte lorsque le modèle egrep semble trop compliqué, 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 ccze plus puissant. Mon seul reproche est qu’il est orienté écran (comme less , que je n’utilise jamais pour cette raison) à moins que vous ne spécifiiez le commutateur -A pour la sortie “ANSI brute”.

+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 est généralement dans mon ~ / .bashrc:

alias tailc = ‘tail -f / mon / app / log / fichier | rcg send “BOLD GREEN” reçoit l’erreur “CYAN” “RED” ‘

une autre façon sale:

 grep -A80 -B80 --color FIND_THIS IN_FILE 

J’ai fait un

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

en bashrc.

Sinon, vous pouvez utiliser le Silver Searcher et faire

 ag  --passthrough 

Si vous voulez mettre en évidence plusieurs motifs de couleurs différentes, consultez ce script bash.

Utilisation de base:

 echo warn error debug info 10 nil | colog 

Vous pouvez modifier les motifs et les couleurs en appuyant sur une touche, puis entrez la clé.

Pour mettre en évidence des motifs lors de la visualisation du fichier entier, 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 sur less -R pour une meilleure lecture.

Pour grep et utiliser 1 couleur pour chaque motif, cxpgrep pourrait convenir.