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 cette chaîne de caractères spéciale.
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?
6 réponses
dire grep
pour traiter votre entrée comme chaîne fixe en utilisant -F
option.
grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
L'Option -n
est nécessaire pour obtenir le numéro de ligne,
grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
celui qui a travaillé pour moi est:
grep -e '->'
L'-e signifie que l'argument suivant est le patron, et ne sera pas interprété comme un argument.
de: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460 /
Une note
à grep pour retour en voiture, à savoir le caractère \r
, ou 0x0d
, nous pouvons faire ceci:
grep -F $'\r' application.log
alternativement, utiliser printf
, ou echo
, pour la compatibilité POSIX
grep -F "$(printf '\r')" application.log
et nous pouvons utiliser hexdump
, ou less
à voir le résultat:
$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000 a \r b \n
concernant l'utilisation de $'\r'
et autres caractères supportés, voir Manuel de Bash > ANSI-C citant :
les mots de la forme $ 'string' sont traités spécialement. Le mot se développe en chaîne de caractères, avec des caractères échappés à l'antislash 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 tous 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
essayez vi avec l'option-b, cela affichera des caractères spéciaux de fin de ligne (Je l'utilise généralement pour voir les fins de ligne de windows dans un fichier txt sur un système d'exploitation unix)
mais si vous voulez une solution scriptée évidemment vi wont travailler de sorte que vous pouvez essayer les options-F ou-e avec grep et pipe le résultat en sed ou awk. De page de manuel de grep:
Matcher Selection -E, -- extend-regexp Interpréter le modèle comme une expression régulière étendue (ERE, voir ci-dessous). (- E est spécifié par POSIX.)
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified
by POSIX.)