Comment faire une barre verticale | travailler dans grep?


10

Voici un exemple de ligne de commande grep que j'ai essayé:

grep '(565172|565173|565175)' /var/log/cups/error_log

Il ne produit aucune sortie, même si les 3 valeurs se trouvent plusieurs fois dans le fichier.

J'ai essayé d'échapper aux barres, et cela a quelque peu amélioré les choses - la valeur moyenne a été détectée mais pas la première ou la dernière.

grep '(565172\|565173\|565175)' /var/log/cups/error_log

J'ai également essayé des échappées doubles et je n'ai plus obtenu de résultats.

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

Qu'est-ce que je fais mal? Merci.

Réponses:


14

La syntaxe que vous essayez d'utiliser appartient aux expressions régulières étendues, donc la réponse est très simple, utilisez egrepou incluez l' -Eindicateur.


17

Ce que vous rencontrez est la différence entre les expressions régulières de base et étendues. Depuis la page de manuel de grep:

Dans les expressions régulières de base, les méta-caractères?, +, {, |, (Et) perdent leur signification spéciale; utilisez plutôt les versions avec barre oblique inversée \ ?, +, {, \ |, (et).

Ainsi, vous pouvez effectuer l'une des opérations suivantes:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

ou

grep -E '(565172|565173|565175)' /var/log/cups/error_log

L'indicateur -E active les expressions régulières "étendues". GNU grep prend également en charge les expressions régulières compatibles perl.


J'ai été distrait lors de la rédaction de ma réponse. On dirait qu'Adam m'a battu au poinçon.
Steven D

4
Mais vous avez ajouté à l'explication - la raison pour laquelle je n'ai pas pu le faire fonctionner est que je n'échappais qu'au bar et non aux parens.
Mark Ransom

1
Je ne savais pas que vous pouvez échapper à nouveau à ces caractères spéciaux pour obtenir le même résultat, alors +1 pour vous!
Adam Byrtek

1
Ce qui précède est l'ensemble d'échanges le plus civilisé que j'ai jamais vu dans SO / SE.
mike rodent
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.