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?

68
demandé sur codeforester 2012-09-12 15:57:57

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
125
répondu Prince John Wesley 2013-12-21 08:30:33

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 /

63
répondu Tom Brito 2013-12-21 08:30:47

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

6
répondu ryenus 2016-09-14 01:06:57
grep -n "\*\^\%\Q\&$\&\^\@$\&\!\^\@$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&
2
répondu Mani 2013-12-21 08:30:55

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

1
répondu R. Kumar 2017-02-10 21:45:42

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.)
-2
répondu user7648830 2017-03-02 16:48:52