Mettez en surbrillance la sortie de recherche de la console, tout en affichant la sortie de commande entière


19

Lorsque j'utilise, par exemple, cat file.txt | grep --color=tty "pattern"le motif que je recherche est mis en surbrillance. Quand je veux un peu plus de contexte autour de chaque coup, grep a les -A, -Bet les -Cparamètres.

Cependant, je veux afficher le fichier entier (ou n'importe quelle sortie de commande) et mettre en évidence un certain modèle. Existe-t-il une telle commande ou outil de mise en évidence?


En quoi ce que vous voulez faire maintenant est-il différent de ce que vous faites déjà?
Benjamin Bannier du

Réponses:


22

Il y avait une réponse sur unix.stackexchange.com qui avait cette astuce intéressante :

grep -E --color 'pattern|$' file.txt

ou

grep --color 'pattern\|$' file.txt

qui correspond à votre modèle ou à la fin de la ligne sur chaque ligne. Seul le motif est mis en évidence.


+1 Simple et facilement adaptable à zgrep, bzgrep, etc. Nice!
Stefan Lasiewski

Existe-t-il un moyen d'éviter de taper --color tout le temps? Je pense qu'il est assez basique d'intégrer l'option de couleur dans grep, je ne sais pas pourquoi nous avons explicitement tapé la couleur à chaque fois. J'ai essayé de créer des scripts disant que les fichiers grepd ont un bash disant grep --color $ 1 $ 2 mais cela ne fonctionne pas. Tout indice ici pour résoudre ce problème s'il vous plaît
Srujan Kumar Gulla

1
@lordlupine: ajoutez GREP_OPTIONS='--color'à votre ~/.bashrc(ou modifiez le paramètre pour l'inclure --color). Vous devrez démarrer un nouveau terminal ou exécuter cette affectation sur la ligne de commande du terminal actuel pour qu'il prenne effet.
pause jusqu'à nouvel ordre.

9

J'aime ack .

ack --passthru somepattern filename

C'est comme grep, mais en mieux. Il est mis en surbrillance par défaut, et avec l' --passthruoption, il montre tout le fichier (ou l'entrée standard) au lieu des seules lignes correspondantes.


1
Si vous essayez de diriger la sortie vers ack, par exemple à partir de tail, vous devez également utiliser l' --filteroption. Par exemple:tail -f myLogFile | ack --filter --passthru pattern
moineau

5

Je recommande également l'utilisation de less(ou tel), mais je veux vous montrer une solution plus didactique. Une fois que vous avez défini cette fonction:

fonction surbrillance ()
{
    sed "s / $ 1 /` tput smso` & `tput rmso` / g" "$ {2: -}"
}

Vous pouvez l'utiliser de cette façon:

command | highlight pattern
highlight pattern file.txt

Remarque: Cette version est sensible à la casse, pour changer celle qui vient s'ajouter iaprès gdans l' sedexpression.


1
J'invoque au tputlieu de coder en dur les valeurs. De cette façon, vous évitez également d'utiliser echo -e, ce qui peut avoir d'autres effets.
Ignacio Vazquez-Abrams

Vous avez absolument raison, je l'ai cherché sans succès. Merci.
cYrus

Cette version n'a pas besoin des parenthèses de capture et peut être exécutée par prog | highlight "pattern"ou highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
Pause jusqu'à nouvel ordre.

Mes sedcompétences n'existent pratiquement pas. Comment devrais-je changer cela afin de faire correspondre le modèle sensible à la casse. Quoi qu'il en soit, j'ajouterai celui-ci à mes fonctions bash_include. Merci beaucoup.
DerMike

@DerMike: Maintenant, il est sensible à la casse.
cYrus

3

Passer -Cà grepune valeur suffisamment élevée le fera.


J'aurais pu jurer avoir obtenu autre chose la dernière fois que j'ai essayé ça. (Chacun correspond au contexte avec des séparateurs '-----' entre les deux.) Maintenant que vous me l'avez dit, ça fonctionne bien :-) Merci.
DerMike

Il séparera chaque correspondance s'il n'y a pas assez de contexte.
Ignacio Vazquez-Abrams

3

less met en évidence le motif, donc

less -p 'mypattern' file.txt

ou

ridiculously | long | pipe | less

puis en moins /pour rechercher un motif qui sera mis en évidence.

Note latérale:

Vous pouvez améliorer votre commande, par exemple
définir un alias alias grep="grep --color=tty"et l'utiliser comme ça:

grep 'mypattern' file.txt;

1
vous devez vous abstenir d'utiliser GREP_OPTIONS, utilisez plutôt un alias. voir: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

Primum non nocere. supprimé.
Casual Coder

GREP_OPTIONS est utilisé par de nombreuses formes de grep(zgrep, bzgrep, bzfgrep, etc.) Donc, si vous voulez que toutes les formes de grep se comportent de manière cohérente, vous devez définir un alias pour chaque forme de grep. La nouvelle réponse de @ Casual ci-dessus ne sera pas pour quelque chose comme bzgrep pattern /var/log/messages.?.gz, qui est un exemple où la mise en évidence des couleurs est TRÈS utile.
Stefan Lasiewski

1

Il y a un bel outil supercat , qui sert exactement ce but. Il peut à la fois coloriser la sortie de votre console et produire un html "surligné" à partir de votre entrée.


Merci, ça a l'air prometteur. Cependant, je n'arrive pas à le faire fonctionner pour le moment.
DerMike

1
Jetez un oeil à ses fichiers de configuration ( /etc/supercatsur Ubuntu), qui définissent les règles de coloration, ce sont essentiellement des paires couleur / expression rationnelle (avec quelques règles supplémentaires); la page de manuel est également courte et agréable.
Ivan Tarasov

J'ai trouvé un spcrcfichier de syntaxe vim sur vim.org/scripts/script.php?script_id=2676
DerMike
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.