Grep für wörtliche Zeichenfolgen

99

Ich bin auf der Suche nach einem Grep-Tool, um nach rein wörtlichen Zeichenfolgen zu suchen. Ich suche nach dem Auftreten einer Zeile einer Protokolldatei als Teil einer Zeile in einer separaten Protokolldatei. Der Suchtext kann alle Arten von Regex-Sonderzeichen enthalten, z []().*^$-\.

Gibt es ein Unix-Suchdienstprogramm, das keinen regulären Ausdruck verwendet, sondern nur nach wörtlichen Vorkommen einer Zeichenfolge sucht?

Ben
quelle
Ich frage mich,grep warum die Frage nicht "Kann ich nach wörtlichen Zeichenfolgen suchen?" War. statt "Gibt es so etwas grep, das nach wörtlichen Zeichenfolgen suchen kann?" Flachkopfschraubendreher passen auf Philips Schraubköpfe, wissen Sie;)
ADTC

Antworten:

133

Sie können dafür grep mit der Option -F verwenden.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
Scott Stafford
quelle
"Newline-getrennte feste Zeichenfolgen" Wie kann ich dies an der Terminal-Eingabeaufforderung tun? Ich weiß, dass ich eine Musterdatei erstellen kann, aber ohne Datei ist dies an der Eingabeaufforderung möglich? Durch Drücken der Eingabetaste wird der Befehl offensichtlich ausgeführt.
ADTC
13
Ich werde meine eigene Frage beantworten. :) Sie müssen nur die mehreren festen Zeichenfolgen mithilfe der Wiederholungen der -eOption bereitstellen . So : grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". Keine Zeilenumbrüche erforderlich;)
ADTC
2
Nicht verfügbar unter Solaris. Stattdessen fgrepwird verwendet.
Majkinetor
2
@ADTC Ich habe herausgefunden, dass ich für die gesuchte Zeichenfolge, die nur Sonderzeichen enthält, einfache Anführungszeichen verwenden muss, sonst wird nichts gefunden. Dies ergab also kein Ergebnis: Die grep --include=\*.php -FRn -e "$$"Verwendung einzelner Quoutes ergab das gewünschte Ergebnis:grep --include=\*.php -FRn -e '$$'
Piemol
2
Sie sind richtig @ADTC. $und einige andere Zeichen sind etwas Besonderes und werden durch Bash ersetzt, nachdem Sie die Eingabetaste gedrückt haben und bevor grep(oder welcher Befehl auch immer) ausgeführt wird. Sie können bash anweisen, alle Zeichen (außer einem einfachen Anführungszeichen) unberührt zu lassen, indem Sie sie in einfache Anführungszeichen setzen. Wenn Sie einen Apostroph eingeben müssen tun es wie folgt'I'\''m special'
ndemou
14

Das ist entweder fgrepoder grep -Fwas keine regulären Ausdrücke macht. fgrepist identisch mit, grep -Faber ich ziehe es vor , mich nicht um die Argumente kümmern zu müssen , da ich an sich faul bin :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).
paxdiablo
quelle
Für GNU grep wird fgrep nur als Symlink zu grep bereitgestellt, wodurch es -F
Daenyth
3
egrepund fgrepsind nicht durch den POSIX-Standard spezifiziert; grep -Fund grep -E sind
Richard Hansen
4

Weitergeben -Fan grep.

Ignacio Vazquez-Abrams
quelle
3

Sie können auch awk verwenden, da es die Möglichkeit hat, feste Zeichenfolgen zu finden, sowie Programmierfunktionen, z. B. nur

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file
Ghostdog74
quelle
2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

Ausgabe

one:hello:world
three:3:kudos
Parandhaman
quelle
2
Ich stimme nicht zu Es ist eine nützliche Illustration, wie dies funktioniert.
Timwaagh