Je trouve le drapeau --color=always
de_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.
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 de celui-ci dans le fichier.
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.
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)
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"
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
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
}
J'ai ajouté ceci à mes .bash_aliases:
highlight() {
grep --color -E "$1|\$"
}
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.
L'option -z
pour grep est également assez lisse!
cat file1 | grep -z "pattern"
une autre manière sale:
grep -A80 -B80 --color FIND_THIS IN_FILE
J'ai fait un
alias grepa='grep -A80 -B80 --color'
à bashrc.
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
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
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" '
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.
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.
Sinon, vous pouvez utiliser The Silver Searcher et faire
ag <search> --passthrough