Ich habe diese:
$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
Ich wollte eine genaue Übereinstimmung von ABB.log finden.
Aber als ich es tat
$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
es zeigt sie alle.
Kann ich mit grep bekommen, was ich wollte?
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Von der grep-Manpage:
quelle
-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:
quelle
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:
Eine einfache while-read-Schleife in der Shell würde dies implizit tun:
quelle
ähnlich mit awk
quelle
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:
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 :Prüfung:
Hinweis:
-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$
.BEARBEITEN: (Zusätzliche Erklärung in Bezug auf @hakre hinzufügen):
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:
quelle
-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 mitgrep
")-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:
quelle
quelle
Funktioniert für mich :
\b
zeigt / setzt Grenzen.Scheint ziemlich schnell zu arbeiten
quelle
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
quelle
Ich würde bevorzugen:
Prost
quelle
ABBxlog
Ich brauchte diese Funktion, wollte aber auch sicherstellen, dass ich keine Zeilen mit einem Präfix vor dem ABB.log zurückgab:
quelle
\W
Wert erfüllt ist, bei dem es sich also um ein Nicht-Leerzeichen handeltxABBxlog
.