120 votes

grep pour les caractères spéciaux dans Unix

J'ai un fichier journal (application.log) qui peut contenir la chaîne suivante de caractères normaux et spéciaux sur plusieurs lignes :

*^%Q&$*&^@$&*!^@$*&^&^*&^&

Je veux rechercher le(s) numéro(s) de ligne qui contient(nt) cette chaîne de caractères spéciaux.

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

La commande ci-dessus ne renvoie aucun résultat.

Quelle serait la syntaxe correcte pour obtenir les numéros de ligne ?

195voto

Prince John Wesley Points 22418

Dites-le à grep pour traiter votre entrée comme une chaîne fixe en utilisant -F option.

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Option -n est nécessaire pour obtenir le numéro de ligne,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

114voto

Tom Brito Points 5485

Celle qui a marché pour moi est :

grep -e '->'

Le -e signifie que le prochain argument est le motif, et ne sera pas interprété comme un argument.

De : http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/

8voto

ryenus Points 679

Une note connexe

Pour grep pour le retour de chariot, à savoir le \r caractère, ou 0x0d nous pouvons le faire :

grep -F $'\r' application.log

Vous pouvez également utiliser printf ou echo pour la compatibilité POSIX

grep -F "$(printf '\r')" application.log

Et nous pouvons utiliser hexdump ou less a voir le résultat :

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

En ce qui concerne l'utilisation de $'\r' et d'autres caractères pris en charge, voir Manuel Bash > Cotation ANSI-C :

Les mots de la forme $'string' sont traités spécialement. Le mot se développe en chaîne de caractères, les caractères antislash étant remplacés comme spécifié par le standard C de l'ANSI.

3voto

Mani Points 717
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2voto

R. Kumar Points 105

Vous pourriez essayer de supprimer tous les caractères alphanumériques et les espaces. Et ensuite utiliser -n vous donnera le numéro de la ligne. Essayez de suivre :

grep -vn "^[a-zA-Z0-9 ]*$" application.log

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X