grep für Sonderzeichen in Unix

91

Ich habe eine Protokolldatei (application.log), die möglicherweise die folgende Zeichenfolge aus Normal- und Sonderzeichen in mehreren Zeilen enthält:

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

Ich möchte nach den Zeilennummern suchen, die diese Sonderzeichenfolge enthalten.

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

Der obige Befehl gibt keine Ergebnisse zurück.

Was wäre die richtige Syntax, um die Zeilennummern zu erhalten?

Avinash Sonee
quelle
^@: bedeutet ^gefolgt von @oder nul Zeichen?
Nahuel Fouilleul

Antworten:

153

Sagen Sie grep, dass Sie Ihre Eingabe mit der -FOption als feste Zeichenfolge behandeln sollen .

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

Option -nist erforderlich, um die Zeilennummer zu erhalten,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Prinz John Wesley
quelle
7
Je Ihre Version von grep Sie brauchen nur zu entkommen (mit einem Backslash) ^, $, ., *und \ . oder du kannst es auch versuchen fgrep.
Nahuel Fouilleul
2
@NahuelFouilleul: +1. Übrigens fgrepist das gleiche wie grep -F.
Prinz John Wesley
@ PrinceJohnWesley: Es ist das gleiche, aber auf einigen Systemen gibt es viele Versionen von grep, so dass mit fgrep die Version gefunden werden kann, die -F unterstützt
Nahuel Fouilleul
Was ist, wenn er benutzt egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
Inckka
Funktioniert nicht grep -rinF '-static'druckt Invalid option «t». Die Antwort von @ Mani hat funktioniert , dh grep -rin "\-static".
Hi-Angel
88

Das, was für mich funktioniert hat, ist:

grep -e '->'

Das -e bedeutet, dass das nächste Argument das Muster ist und nicht als Argument interpretiert wird.

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

Tom Brito
quelle
str = '! "# $% & () * +, -. / :; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... NICHT ARBEITEN, was für Sie funktioniert hat, hatte nicht genug Sonderzeichen außer dem
Wechselzeichen
1
Das einzige, was für mich funktioniert, auch '\' oder -F oder fgrep funktionieren nicht. Vielen Dank!
user180574
2
Dies sollte die akzeptierte Antwort sein - einfach und funktioniert für grep
Ishay Peled
1
Versucht -F und fgrep funktionieren bei mir nicht, wenn ich nach einem String suche, der '-' char enthält. Das funktioniert.
知名 伟人
Ich frage mich, warum diese Antwort in dieser Frage enthalten ist ( stackoverflow.com/q/12387685 als Referenz für Fragen und Antworten, die ich gerade ansehe ) - wahrscheinlich ein falscher Fall, in dem Antworten aus einer anderen Frage zusammengeführt werden? Informationen zur Suche nach Mustern ab -finden Sie auch unter stackoverflow.com/questions/2427913/…
Sundeep,
6

Ein verwandter Hinweis

Um nach Wagenrücklauf zu suchen, nämlich nach dem \rCharakter, oder 0x0dkönnen wir dies tun:

grep -F $'\r' application.log

Alternativ können Sie printfoder echoaus Gründen der POSIX-Kompatibilität verwenden

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

Und wir verwenden können hexdump, oder sehen das Ergebnis:less

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

Informationen zur Verwendung von $'\r'und anderen unterstützten Zeichen finden Sie im Bash-Handbuch> ANSI-C-Anführungszeichen :

Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert, wobei Zeichen mit Backslash-Escapezeichen gemäß ANSI C-Standard ersetzt werden

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

Sie können versuchen, alphanumerische Zeichen und Leerzeichen zu entfernen. Und dann erhalten Sie mit use -ndie Zeilennummer. Versuchen Sie Folgendes:

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

R. Kumar
quelle
Danke. Es funktioniert gut für mich, die Sonderzeichen aus einer Datei zu finden.
Dipankar Nalui
-4

Versuchen Sie vi mit der Option -b. Dies zeigt spezielle Zeichen am Zeilenende an (ich verwende es normalerweise, um Windows-Zeilenenden in einer txt-Datei unter einem Unix-Betriebssystem anzuzeigen).

Aber wenn Sie eine Skriptlösung wollen, die offensichtlich nicht funktioniert, können Sie die Optionen -f oder -e mit grep ausprobieren und das Ergebnis in sed oder awk weiterleiten. Von der Grep-Manpage:

Matcher-Auswahl -E, --extended-regexp Interpretieren Sie PATTERN als erweiterten regulären Ausdruck (ERE, siehe unten). (-E wird von POSIX angegeben.)

   -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
quelle
2
Inwiefern ist dies besser als eine akzeptierte Antwort, also haben Sie sie zu einer fast 5 Jahre alten Frage hinzugefügt?
SergGr