Antworten:
Geben Sie einfach die regulären Ausdrucksanker an.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Von der grep-Manpage:
-F, --fixed-strings
Interpretieren Sie PATTERN als (Liste) fester Zeichenfolgen
-x, --line-regexp
Wählen Sie nur die Übereinstimmungen aus, die genau mit der gesamten Zeile übereinstimmen.
-F
? Sind Sie auf Solaris? Wenn ja, verwenden Sie/usr/xpg4/bin/grep
grep
in einem Bash-Skript und diese Option ist besser als die Verwendung eines regulären Ausdrucks, wie in der akzeptierten Antwort vorgeschlagen. Da die Variable, nach der ich suche (wie .
), ein Sonderzeichen enthält, muss ich sie bei Verwendung des Befehls nicht umgehen.
Folgendes mache ich, obwohl die Verwendung von Ankern der beste Weg ist:
grep -w "ABB.log " a.tmp
ABB.log
, was nicht der allgemeine Fall ist, dh es wird die meiste Zeit fehlschlagen.
Die meisten Vorschläge schlagen fehl, wenn nur ein einziger führender oder nachfolgender Bereich vorhanden ist. Dies wäre wichtig, wenn die Datei von Hand bearbeitet wird. Dies würde es in diesem Fall weniger anfällig machen:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
Eine einfache while-read-Schleife in der Shell würde dies implizit tun:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
ähnlich mit awk
awk '/^ABB\.log$/' file
Ich beabsichtige, einige zusätzliche Erklärungen zu den Versuchen von OP und anderen Antworten hinzuzufügen.
Sie können die Lösung von John Kugelmans auch folgendermaßen verwenden:
grep -x "ABB\.log" a.tmp
Wenn Sie den String zitieren und dem Punkt ( .
) entkommen, wird das -F
Flag nicht mehr benötigt.
Sie müssen den .
(Punkt) maskieren (da er mit einem beliebigen Zeichen übereinstimmt (nicht nur .
), wenn er nicht maskiert ist) oder das -F
Flag mit grep verwenden. -F
Flag macht es zu einer festen Zeichenfolge (kein regulärer Ausdruck).
Wenn Sie die Zeichenfolge nicht zitieren, benötigen Sie möglicherweise einen doppelten Backslash, um den Punkt ( .
) zu umgehen :
grep -x ABB\\.log a.tmp
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-x
zwingt, die ganze Linie anzupassen..
ohne -F
Flag sind falsch.-x
Wechsel vermeiden , indem Sie Ihre Musterzeichenfolge mit ^
und umschließen $
. Stellen Sie in diesem Fall sicher, dass Sie nicht verwenden -F
, sondern dem entkommen .
, da dies -F
die Regex-Interpretation von ^
und verhindert $
.Wenn Sie eine Zeichenfolge ab beginnen möchten, -
sollten Sie sie --
mit grep verwenden. Was auch immer folgt, --
wird als Eingabe verwendet (keine Option).
Beispiel:
echo -f |grep -- "-f" # where grep "-f" will show error
echo -f |grep -F -- "-f" # whre grep -F "-f" will show error
grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename
-F
nicht benötigt wird, wenn das .
richtig entkommen ist.
-F
verfügbar, als du das geschrieben hast? Wenn nicht, welches System haben Sie verwendet? Ich konnte diese Informationen in Ihrer Antwort bisher nicht finden, was auch jetzt noch der Fall ist, wenn ich sie erneut lese. Also wirklich sicher, ich habe Ihre Antwort mindestens zweimal vollständig gelesen. ;)
-F
vorhanden. (Ich sagte: "oder benutze -F
Flagge mit grep
")
-F
die Antwort lautet, warum sollte man sich dann die Mühe machen, zu fliehen? Was ist deine Meinung dazu?
Das hat bei mir gut funktioniert, als ich versucht habe, etwas Ähnliches zu tun:
grep -F ABB.log a.tmp
$ cat venky
ABB.log
ABB.log.122
ABB.log.123
$ cat venky | grep "ABB.log" | grep -v "ABB.log\."
ABB.log
$
$ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
ABB.log.122
$
Funktioniert für mich :
grep "\bsearch_word\b" text_file > output.txt
\b
zeigt / setzt Grenzen.
Scheint ziemlich schnell zu arbeiten
search_word
die durch Wortgrenzen getrennte Zeilen enthält . Zum Beispiel würde es mit der Zeile "foo search_word bar" übereinstimmen.
Dies ist bei HPUX der Fall, wenn der Inhalt der Dateien Leerzeichen zwischen Wörtern enthält: Verwenden Sie Folgendes:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
Ich würde bevorzugen:
str="ABB.log"; grep -E "^${str}$" a.tmp
Prost
ABBxlog
Ich brauchte diese Funktion, wollte aber auch sicherstellen, dass ich keine Zeilen mit einem Präfix vor dem ABB.log zurückgab:
grep "\WABB.log$" -w a.tmp
\W
Wert erfüllt ist, bei dem es sich also um ein Nicht-Leerzeichen handelt xABBxlog
.