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.