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.

Mark Ransom
la source

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.

Adam Byrtek
la source
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.

Steven D
la source
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