grep exclut sur la phrase avec [caractère

J’ai besoin de faire un grep qui exclut les phrases contenant “Ceci est une phrase [WARN]” par exemple:

aaaabbbbccccCeci est une phrase [WARN] ccccdddd

mais quand je fais:

grep WARN log / * | grep -v -E ‘Ceci est une phrase [WARN]’

ça ne marche pas. Je pense que c’est à cause des “[” et “]” car si je le fais:

grep WARN log / * | grep -v -E ‘Ceci est une phrase’

Ça marche. Comment puis-je exclure une phrase contenant des crochets?

MODIFIER:

Désolé, j’aurais dû dire – la chaîne est en fait une sous-chaîne. Donc je peux avoir:

aaaabbbbccccCeci est une phrase [WARN] ccccdddd

qui doit être exclu.

-E est pour l’expression rationnelle étendue. Il suffit d’échapper aux crochets [] et vous devriez être bon.

 grep WARN log/* | grep -v -E 'This is a sentence \[WARN\]' 

[] signifie que la classe de caractères n’est pas échappée, donc ce que votre modèle recherchera, c’est l’une des sous-chaînes suivantes:

  • Ceci est une phrase W
  • Ceci est une phrase A
  • Ceci est une phrase R
  • Ceci est une phrase N

Vous devez dire à grep d’utiliser la chaîne en tant que chaîne fixe. Pour cela, vous pouvez utiliser -F :

 grep WARN log/* | grep -v -F 'This is a sentence [WARN]' 

De l’ man grep :

-F, –fixed-ssortingngs

Interpréter le MOTIF sous la forme d’une liste de chaînes fixes, séparées par des nouvelles lignes. (-F est spécifié par POSIX.)

Tester

 $ cat a This is a sentence [LOG] This is a sentence [WARN] $ grep -v "sentence [LOG]" a <---- [LOG] is taken as regex This is a sentence [LOG] This is a sentence [WARN] $ grep -Fv "sentence [LOG]" a <---- [LOG] is taken literally This is a sentence [WARN] 

Ou avec entrée mise à jour:

 $ cat a aaaabbbbccccThis is a sentence [WARN]ccccdddd aaaabbbbccccThis is a sentence [LOG]ccccdddd hello! $ grep -vF "sentence [WARN]" a aaaabbbbccccThis is a sentence [LOG]ccccdddd hello!