Ich habe zum Beispiel eine große Textdatei mit vielen E-Mail-Adressen. Mit Bash muss ich suchen / überprüfen, ob eine E-Mail existiert (oder nicht). Sollte man (nur) die "Anker" verwenden?
grep '^[email protected]' text_file
oder gibt es bessere möglichkeiten Ich muss ein Bash-Skript erstellen und möchte sicher sein.
grep -q '^user1@example\.com\>'
- mit einem Zeilenanker am Anfang und einem Wortendanker am Ende verwenden.Antworten:
Siehe die Optionen
-F
(feste Zeichenfolge im Gegensatz zum regulären Ausdruck) und-x
(genau: Übereinstimmung mit der gesamten Zeile).wäre das Äquivalent von:
(Denken Sie daran, dass dies
.
ein Operator für reguläre Ausdrücke ist, der mit einem beliebigen Zeichen übereinstimmt.)Verwenden Sie die
-q
Option, wenn Sie nur prüfen möchten, ob es eine solche Zeile gibt:Wenn die zu durchsuchende Zeile und der Dateiname variabel sind:
Oder
Du willst nicht:
grep -Fxq "$email" "$file"da dies probleme verursachen würde wenn
$email
oder$file
mit-
.Wenn die Datei sortiert ist (vorzugsweise in Ihrem aktuellen Gebietsschema
C
), können Sie möglicherweise die Geschwindigkeit erhöhen, indem Siecomm
anstelle vongrep
:Der Vorteil wird deutlicher, wenn Sie mehrere E-Mail-Adressen prüfen müssen (zum Beispiel in einer anderen sortierten Datei):
wäre schneller als:
quelle
grep -Fxq -- "$email" "$file"
funktioniert auch.<
redirector von einer dateieingabe (von grep verarbeitet) zu stdin gewechselt ? Gibt es irgendwelche Vorteile?-
. sogargrep -- "$email" "$file"
wäre ein Problem für eine Datei namens-
(diegrep
speziell als Bedeutung stdin behandelt )Um so effizient wie möglich zu sein, möchten Sie anhalten, nachdem die erste Übereinstimmung gefunden wurde. Wenn Sie GNU haben
grep
, können Sie dies tun:Andernfalls können Sie Perl verwenden:
quelle
-m
ist GNU-spezifisch. Verwenden Sie POSIX,-q
wenn Sie effizient prüfen möchten, ob eine solche Linie vorhanden ist.Dort gibt es viele E-Mail-Prüfungen. Eines davon ist:
Um meine Antwort zu erläutern.
Sie verwenden den
^
Anker, der den Anfang der Zeichenfolge angibt. Dies stimmt nicht überein, wenn sich eine E-Mail-Adresse irgendwo zwischen einer langen Zeichenfolge befindet.quelle
Ihr
grep
Befehl stimmt mit allem überein, was beginnt^[email protected]
, einschließlich der E-Mail-Adresse selbst, aber auch[email protected]
. Da.
es sich bei regulären Ausdrücken um ein Sonderzeichen handelt, das mit einem beliebigen Schlüssel übereinstimmt, sollten Sie es als maskieren\.
Unter der Annahme, dass Ihre Textdatei eine Adresse pro Zeile enthält, verwenden Sie:
das abschließende
$
wird sicherstellen, dass die zeile nach der email-adresse endet. Ich benutze auch doppelte Anführungszeichen"
, da diese erlauben, Variablen zu verwenden (im Gegensatz zu einfachen Anführungszeichen'
)quelle
user1@example-com
.-Fx
.-Fx
aber das ist stephanes antwort :-)Unter Berücksichtigung der allgemeinen wörtlichen / genauen Übereinstimmung der Zeichenfolgen:
oder,
quelle