42 votes

Grep "+" operator does not work

Ceci

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

affiche ceci :

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

mais cela:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

n'affiche rien.

Pourquoi? J'ai simplement changé * en +. N'est-ce pas similaire? L'opérateur + requiert simplement au moins une correspondance, et * zéro ou plusieurs.

48voto

MiJyn Points 3180

C'est parce que grep (sans aucun argument) ne fonctionne qu'avec des expressions régulières standard. + fait partie des expressions régulières étendues, donc pour l'utiliser, vous devez utiliser grep -E ou egrep:

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

De plus, vous pouvez simplement faire ceci si vous ne voulez pas utiliser d'expressions régulières étendues :

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."

15voto

Zakaria Points 175

Pour élaborer sur la réponse de MiJyn, les "caractères spéciaux" comme + fonctionnent également dans les regex standard, mais vous devez les échapper avec un backslash. On pourrait dire que les attentes par défaut sont inversées entre les regex standard et étendues :

Dans les regex standard, les caractères correspondent littéralement par défaut. Par exemple, dans grep "ab+" le + est un + littéral. Le regex trouverait par exemple "ab+ab", mais pas "abbbb". Pour utiliser la signification "spéciale" de +, vous devez l'échapper. Donc grep "ab\+" trouverait "abbb", mais plus "ab+ab". Car dans le dernier exemple, le + est interprété comme le quantificateur "un ou plusieurs de cela", dans ce cas "un ou plusieurs b".

Dans les regex étendus, c'est exactement l'inverse. Ici, vous devez échapper les "caractères spéciaux" pour qu'ils soient traités littéralement. Donc grep -E "ab+" trouve "abbb", mais pas "ab+ab". Si vous échappez le +, il est trouvé littéralement. Donc grep -E "ab\+" trouve "ab+ab", mais pas "abbb".

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X