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]’
- php exec renvoie moins de résultats que d’entrer directement dans la ligne de commande
- grep pour ignorer le premier caractère
- Grep out toutes les extensions de fichiers depuis l’entrée
- Comment récupérer certains noms de fichiers en utilisant grep?
- Filtrer le fichier et envoyer des lignes dans l’un des deux fichiers
ç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:
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.)
$ 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!