Comment faire une barre verticale | travailler dans grep?

Voici un exemple de command line 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 sont dans le file plusieurs fois.

J'ai essayé d'échapper aux barres, et cela a amélioré un peu 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 aussi essayé les doubles évasions et je suis revenu à ne pas avoir de résultats.

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

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

La syntaxe que vous essayez d'utiliser appartient à des expressions régulières étendues, donc la réponse est très simple, utilisez egrep ou incluez l' egrep -E .

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

Dans les expressions régulières de base, les méta-caractères?, +, {, |, (, Et) perdent leur signification particulière; utilisez plutôt les versions backslashed \ ?, +, {, \ |, (, et).

Ainsi, vous pouvez faire l'une des choses 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 "Extended". GNU grep prend également en charge les expressions régulières compatibles perl.