Например, у меня большой текстовый файл со многими адресами электронной почты, используя bash, мне нужно найти / проверить, существует ли электронная почта (или ее нет). Следует ли использовать (только) «якоря»?
grep '^user1@example.com' text_file
или есть лучшие способы? Мне нужно создать скрипт bash, и я бы хотел быть в безопасности.
grep -q '^user1@example\.com\>'
- с привязкой строки в начале и привязкой конца слова в конце.Ответы:
См.
-F
(Фиксированная строка в отличие от регулярного выражения) и-x
(точный: соответствовать всей строке) параметры.будет эквивалентно:
(помните, что
.
это оператор регулярного выражения, соответствующий любому символу).Используйте эту
-q
опцию, если вы хотите проверить, есть ли такая строка:Если строка для поиска и имя файла являются переменными:
Или
Вы не хотите:
grep -Fxq "$email" "$file"так как это может вызвать проблемы, если
$email
или$file
началось с-
.Если файл отсортирован (предпочтительно в вашей текущей локали
C
), вы можете ускорить процесс, используяcomm
вместоgrep
:Преимущество станет более очевидным, когда вам нужно проверить несколько адресов электронной почты (например, в другом отсортированном файле):
будет быстрее чем:
источник
grep -Fxq -- "$email" "$file"
тоже работает.<
перенаправителя? есть ли преимущества?-
. дажеgrep -- "$email" "$file"
было бы проблемой для файла с именем-
(которыйgrep
трактуется как «стандартный ввод» )Чтобы быть максимально эффективным, вы хотите остановиться после того, как будет найдено первое совпадение. Если у вас есть GNU
grep
, вы можете сделать это:Если вы этого не сделаете, вы можете использовать Perl:
источник
-m
является специфическим для GNU. Используйте POSIX,-q
если вы хотите эффективно проверить, есть ли такая линия.Там много проверок по электронной почте. Одним из них является:
Чтобы уточнить мой ответ.
Вы используете
^
якорь, который указывает начало строки. Это не будет совпадать, если адрес электронной почты находится где-то между длинной строкой.источник
Ваша
grep
команда будет соответствовать всему, с чего начинается^user1@example.com
, включая сам адрес электронной почты, но такжеuser1@example.com.spammer.com
. так.
как это специальный символ в регулярных выражениях, который соответствует любой клавише, вы должны экранировать его как\.
предполагая, что ваш текстовый файл содержит один адрес на строку, используйте:
трейлинг
$
убедится, что строка заканчивается после адреса электронной почты. я также использую двойные кавычки"
, так как они позволяют использовать переменные (в отличие от одинарных кавычек'
)источник
user1@example-com
.-Fx
.-Fx
но это ответУчитывая общее литеральное / точное совпадение строк:
или,
источник