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 souhaite rechercher le ou les numéros de ligne contenant 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?
Dites à grep
de traiter votre entrée comme une chaîne fixe en utilisant l'option -F
.
grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
L'option -n
est requise pour obtenir le numéro de ligne,
grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Celui qui a fonctionné pour moi est:
grep -e '->'
Le -e signifie que l'argument suivant 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/
Pour grep pour le retour chariot, à savoir le caractère \r
ou 0x0d
, nous pouvons faire ceci:
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
pour 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> Citation ANSI-C :
Les mots de la forme $ 'chaîne' sont traités spécialement. Word se développe en chaîne, avec les caractères d'échappement avec une barre oblique inversée remplacés comme spécifié par la norme ANSI C
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&
Vous pouvez essayer de supprimer les caractères alphanumériques et l’espace. Et ensuite, utilisez -n
vous donnera le numéro de ligne. Essayez de suivre:
grep -vn "^[a-zA-Z0-9 ]*$" application.log