скобки регулярного выражения grep не работают должным образом

Вместо того, чтобы управлять длинным списком ботов, вы можете отфильтровать ботов на основе нескольких ключевых слов, присутствующих в строке -агента пользователя, и пропустить только определенных ботов.

Я использую это, чтобы заблокировать всех пауков/ботов, которые я не хочу сканировать на моем сайте. Затем из них я пропускаю только тех, кто заинтересован в индексации веб-сайта. Все остальные блокируются брандмауэром.

Пока это работает достаточно хорошо для меня.

sudo nohup tail -f /var/log/apache2/access.log | awk -F' - |\"' 'tolower($7) ~ /bot|crawler|spider/ && tolower($7) !~ /google|yahoo|bing|msn|ask|aol|duckduckgo/{system("    sudo ufw deny from "$1" to any comment \""$7"\"")}' > /dev/null &
0
27.08.2020, 22:43
1 ответ

Несколько grepреализаций имеют опцию -P, которая позволяет вам использовать Perl -как регулярное выражение и, в частности, perlоператор отрицательного просмотра вперед (?!...).

Таким образом, для поиска screenshotвхождений, которые не найдены после //, вы можете сделать:

grep -P '^(?:(?!//).)*screenshot'

В стандартных базовых регулярных выражениях нет \s. POSIX требует, чтобы [\s]внутри выражений в квадратных скобках соответствовало либо \, либо s. Снаружи поведение не определено, что позволило некоторым grepреализациям, таким как последние версии GNU grep, придать ему значение, аналогичное тому, что оно имеет вperl(эквиваленте стандарта[[:space:]]).

Здесь вы также можете использовать реальную вещь и сделать:

perl -ne 'print if s|//.*||r =~ /screenshot/'

Для полноты картины ast -открытая реализация grepимеет параметр -Xдля расширенных регулярных выражений. И эти регулярные выражения имеют !оператор отрицания. Итак, вы также можете:

grep -X '^(.*//.*)!screenshot'

С помощью sedвы также можете удалить комментарии после того, как сделаете копию пространства шаблонов в пространство хранения, прежде чем проверять наличиеscreenshot:

sed 'h;s|//.*||;/screenshot/!d;g'

Сawk:

awk -F // 'index($1, "screenshot")'

(index()для проверки подстроки используйте $1 ~ /screenshot/для (расширенного )сопоставления регулярных выражений ).

Если разделитель полей установлен на //, $1является частью перед //.

2
18.03.2021, 23:09

Теги

Похожие вопросы