GNU/Linux >> Tutoriels Linux >  >> Linux

Mettez en surbrillance le texte comme grep, mais ne filtrez pas le texte

Utilisez ack. Commander son --passthru option ici :ack. Il a l'avantage supplémentaire de permettre des expressions régulières complètes en Perl.

$ ack --passthru 'pattern1' file_name

$ command_here | ack --passthru 'pattern1'

Vous pouvez également le faire en utilisant grep comme ceci :

$ grep --color -E '^|pattern1|pattern2' file_name

$ command_here | grep --color -E '^|pattern1|pattern2'

Cela correspondra à toutes les lignes et mettra en évidence les motifs. Le ^ correspond à chaque début de ligne, mais ne sera pas imprimé/surligné puisqu'il ne s'agit pas d'un caractère.

(Notez que la plupart des configurations utiliseront --color par défaut. Vous n'aurez peut-être pas besoin de cet indicateur).


Vous pouvez vous assurer que toutes les lignes correspondent mais il n'y a rien à mettre en évidence sur les correspondances non pertinentes

egrep --color 'apple|' test.txt 

Remarques :

  • egrep peut aussi s'écrire grep -E
  • --color est généralement par défaut dans la plupart des distributions
  • certaines variantes de grep "optimiseront" la correspondance vide, vous pouvez donc utiliser "apple|$" à la place (voir :https://stackoverflow.com/a/13979036/939457)

MODIF :

Cela fonctionne avec le grep d'OS X Mountain Lion :

grep --color -E 'pattern1|pattern2|$'

C'est mieux que '^|pattern1|pattern2' parce que le ^ une partie de l'alternance correspond au début de la ligne alors que le $ correspond à la fin de la ligne. Certains moteurs d'expressions régulières ne mettront pas en surbrillance pattern1 ou pattern2 car ^ déjà apparié et le moteur est impatient .

Quelque chose de similaire se produit pour 'pattern1|pattern2|' car le moteur regex remarque que l'alternance vide à la fin de la chaîne de modèle correspond au début de la chaîne sujet.

[1]: http://www.regular-expressions.info/engine.html

PREMIÈRE MODIFICATION :

J'ai fini par utiliser perl :

perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'

Cela suppose que vous disposez d'un terminal compatible ANSI.

RÉPONSE ORIGINALE :

Si vous êtes coincé avec un étrange grep , cela pourrait fonctionner :

grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'

Ajustez les chiffres pour obtenir toutes les lignes souhaitées.

Le deuxième grep supprime simplement le -- superflu lignes insérées par le style BSD grep sur Mac OS X Mountain Lion, même lorsque les contextes de correspondances consécutives se chevauchent.

Je pensais que GNU grep avait omis le -- lignes lorsque le contexte se chevauche, mais ça fait un moment donc peut-être que je me souviens mal.


Linux
  1. Décompresser un fichier .gz pour obtenir un fichier texte mais obtenir un fichier binaire ? ?

  2. VPS vs VPN – Des noms similaires, mais des fonctions complètement différentes

  3. Comment trouver les fins de ligne dans un fichier texte ?

  4. Commande Linux :Comment "trouver" uniquement des fichiers texte ?

  5. Comment trouver des fichiers texte ne contenant pas de texte sous Linux ?

Commande Grep sous Linux (Rechercher du texte dans des fichiers)

Manipuler du texte avec sed et grep

Manipuler du texte en ligne de commande avec grep

Comment extraire des adresses e-mail d'un fichier texte sous Linux

Rechercher du texte dans des fichiers sous Linux à l'aide de grep

Utilisation élevée de la mémoire mais aucun processus ne l'utilise