grep pour les caractères spéciaux sous Unix

92

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?

Avinash Sonee
la source
^@: signifie ^suivi @ou caractère nul?
Nahuel Fouilleul

Réponses:

154

Dites grepà traiter votre entrée comme une chaîne fixe en utilisant l' -Foption.

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

Une option -nest requise pour obtenir le numéro de ligne,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Prince John Wesley
la source
7
Selon votre version de grep vous ne devez échapper (avec une barre oblique inverse) ^, $, ., *et \ . ou vous pouvez essayer fgrepaussi.
Nahuel Fouilleul
2
@NahuelFouilleul: +1. btw, fgrepest le même que grep -F.
Prince John Wesley
@PrinceJohnWesley: c'est pareil mais sur certains systèmes il existe de nombreuses versions de grep donc en utilisant fgrep peut trouver la version qui supporte -F
Nahuel Fouilleul
Et s'il l'utilise egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka
Ça ne marche pas. grep -rinF '-static'impressions Invalid option «t». La réponse de @ Mani a fonctionné , c'est-à-dire grep -rin "\-static".
Hi-Angel
89

Celui qui a fonctionné pour moi est:

grep -e '->'

Le -e signifie que l'argument suivant est le modèle et ne sera pas interprété comme un argument.

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

Tom Brito
la source
str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... NE FONCTIONNE PAS, ce qui a fonctionné pour vous n'avait pas assez de caractères spéciaux en plus du signe de commutation '-', mais gagner -F au lieu de -e fonctionne!
THESorcerer
1
La seule chose fonctionne pour moi, même «\» ou -F ou fgrep ne fonctionnent pas. Merci!
user180574
2
Cela devrait être la réponse acceptée - simple et fonctionne pour grep
Ishay Peled
1
J'ai essayé -F et fgrep ne fonctionne pas pour moi lors de la recherche d'une chaîne include '-' char. Cela marche.
世界 知名 伟人
Je me demande pourquoi cette réponse est présente dans cette question ( stackoverflow.com/q/12387685 pour référence aux questions et réponses que je regarde actuellement) - probablement un mauvais cas de réponses fusionnées à partir d'une autre question? Pour rechercher des modèles commençant par -, voir aussi stackoverflow.com/questions/2427913/…
Sundeep
6

Une note connexe

Pour grep pour le retour chariot, à savoir le \rcaractè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 lesspour 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> Citations ANSI-C :

Les mots de la forme $ 'string' sont traités spécialement. Le mot se développe en chaîne, avec des caractères d'échappement par barre oblique inverse remplacés comme spécifié par la norme ANSI C

Ryenus
la source
3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&
Mani
la source
2

Vous pouvez essayer de supprimer tous les caractères alphanumériques et l'espace. Et puis utiliser -nvous donnera le numéro de ligne. Essayez de suivre:

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

R. Kumar
la source
Merci .. Cela fonctionne bien pour moi de trouver les caractères spéciaux d'un fichier.
Dipankar Nalui
-4

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 Windows dans un fichier txt sur un système d'exploitation unix)

Mais si vous voulez une solution scriptée, vi ne fonctionnera évidemment pas, vous pouvez donc essayer les options -f ou -e avec grep et rediriger le résultat vers sed ou awk. Depuis la page de manuel de grep:

Sélection de correspondance -E, --extended-regexp Interpréter PATTERN 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.)
user7648830
la source
2
En quoi c'est mieux qu'une réponse acceptée, alors vous l'avez ajoutée à une question vieille de presque 5 ans?
SergGr