В этой статье я расскажу о полезной однострочной команде, которая может выполнить следующие действия: прочитать текстовый файл с email-адресами из stdin, проверить их валидность и сгенерировать JSON-вывод с результатами в stdout. JSON — это популярный формат для API, поэтому умение генерировать JSON-вывод весьма полезно.
Еще по теме: Библиотеки Python для хакеров и безопасников
Быстрая обработка почты с помощью JQ
Вот эта однострочная команда, которая выполняет всю работу. Может показаться сложной, но на самом деле это не так. Я объясню все, что вам нужно знать:
1 |
cat emails.txt | jq -Rn '[inputs | {"email": ., "valid": (test("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")?)}]' |
Файл emails.txt содержит email-адреса. Вот пример его содержимого:
1 |
john.doe@example.com invalid-email@ jane_smith123@domain.co.uk user@domain another.valid.email@sub.domain.com no-at-symbol.com valid.email@domain.org |
Разберем команду по частям:
- jq -Rn — обрабатывает ввод как обычные строки, а не JSON, каждая строка — отдельная строка. -n запускает jq с нулевым вводом, позволяя создать JSON-вывод.
- inputs — это фильтр, который читает все строки ввода из stdin. Внешние скобки […] указывают на создание массива объектов.
- {"email": ., "valid": …} — генерирует JSON-объект для каждого проверяемого email. Значение valid будет сгенерировано функцией «test», которая проверяет валидность адреса с помощью регулярного выражения.
- test(…) — содержит регулярное выражение для проверки валидности email.
- ^[a-zA-Z0-9._%+-]+ — соответствует началу строки с одним или более допустимыми символами перед символом @.
- @[a-zA-Z0-9.-]+ — соответствует символу @, за которым следуют один или более допустимых символов для домена.
- \\. — соответствует точке. Обратный слеш \\ используется для экранирования точки в регулярном выражении.
- [a-zA-Z]{2,}$ — соответствует домену верхнего уровня, который должен иметь не менее двух символов.
- ? — гарантирует, что test вернет false вместо ошибки, если ввод не соответствует регулярному выражению.
Теперь давайте выполним нашу команду для файла email.txt. Как видите она генерирует очень красивый и читаемый JSON-вывод для каждого email:
1 |
cat emails.txt | jq -Rn '[inputs | {"email": ., "valid": (test("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")?)}]' [ { "email": "john.doe@example.com", "valid": true }, { "email": "invalid-email@", "valid": false }, ... ... ...] |
jq — это мощный инструмент, как grep для JSON-файлов. Он может делать много разных вещей и особенно полезен, когда нужно быстро выполнить проверки. В следующей статье я покажу пример использования px-1 py-px text-[0.9rem]"]inotify для запуска выполнения скрипта при создании файла.
ПОЛЕЗНЫЕ ССЫЛКИ: