Назад | Перейти на главную страницу

SED для поиска и удаления ip с частичным совпадением

У меня есть различные сценарии 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