У меня есть различные сценарии bash, которые запускаются, они сканируют файлы журналов на предмет тех, кто пытается навредить, спамить нас и так далее.
Я боролся с этим несколько дней, пытаясь понять это.
У меня есть текстовый файл со списком IP-адресов
Я использую sed для сканирования списка и удаления IP-адресов, таких как наш IP-адрес и другие известные IP-адреса и диапазоны IP-адресов. Это добавлено к этому списку от людей, которые, возможно, совершили ошибку.
например
В первой линии я пытаюсь сопоставить все 45.182.32.165
и любой ip, начинающийся с 45.
В идеале я бы хотел удалить следующее 45.0.0.0/8
и / или любую из сетевых масок до /24
sed -i '' '/^45.*.*.*/d' /directory/blocked_subnets/somelist
sed -i '' '/^50.81.238.*/d' /directory/blocked_subnets/somelist
sed -i '' '/^50.84..*/d' /directory/blocked_subnets/somelist
Иногда эти строки работают не так, как задумано.
Я пробовал различные регулярные выражения, которые нашел в сети, но они, похоже, не работают.
Я надеялся, что кто-то, у кого больше опыта в этом, поможет мне улучшить этот sed -i для правильной работы.
«» - это потому, что я делаю это на машине freebsd.
Заранее спасибо.
Спасибо за помощь.
Увы, ни одно из приведенных выше предложений мне не подошло.
После долгого чтения и экспериментов
Я обнаружил, что нужно добавить -r (для активации регулярного выражения) перед -i, и это формат, который я использовал для регулярного выражения, который, кажется, работает.
sed -r -i '' '/^120[. Knight152[.子[0–9 ]{1,3}[. Knight0–9 ]{1,3}/d' / path / to / some /файл
убрать ip 120.152.35.192 из файла "файл"
Я тестировал регулярное выражение на «Тренере Regedx», оно кажется действительным.
Однако я был бы признателен за любые дополнительные комментарии и предложения по уточнению вышеизложенного.
С уважением
Я думаю, ваша проблема в том, что .
работает как подстановочный знак, соответствующий любому символу, вместо этого используйте \.
что соответствует буквальному .
.
К сожалению, я не знаю различий с FreeBSD, но, поскольку это довольно простое регулярное выражение, я думаю, оно должно работать. Я бы использовал в качестве общего регулярного выражения (очень упрощенного) для любого IP-адреса следующее:
'/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/d'
^
: Начинается с[0-9]
: Любая цифра+
: Предыдущее совпадение встречается 1 или более раз\.
: Буквальная точкаИтак, теперь, если бы я хотел соответствовать тому, что вам нужно, я бы изменил каждый октет, чтобы он соответствовал сети:
sed -i '' '/^45\.[0-9]+\.[0-9]+\.[0-9]+/d' /directory/blocked_subnets/somelist
sed -i '' '/^50\.81\.238\.[0-9]+/d' /directory/blocked_subnets/somelist
sed -i '' '/^50\.84\.[0-9]+\.[0-9]+/d' /directory/blocked_subnets/somelist
Также учтите, что это будет работать, только если каждая строка списка начинается с IP (даже без пробелов перед IP). Если это не так, просто удалите ^
Видеть: https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html