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

У меня работают различные сценарии bash, они сканируют файлы журналов на предмет тех, кто пытается навредить, спамить нас и так далее.

Я боролся с этим несколько дней, пытаясь понять это.

У меня есть текстовый файл со списком IP-адресов.

Я использую sed для сканирования списка и удаления IP-адресов, таких как наш IP-адрес и другие известные IP-адреса и диапазоны IP-адресов. Это добавлено к этому списку от людей, которые, возможно, совершили ошибку.

например

В первой строке я пытаюсь сопоставить все 45.182.32.165

У меня есть текстовый файл со списком IP-адресов.

Я использую sed для сканирования списка и удаления IP-адресов, таких как наш IP-адрес и другие известные IP-адреса и диапазоны IP-адресов. Это добавлено к этому списку от людей, которые, возможно, совершили ошибку.

например

В первой строке я пытаюсь сопоставить все 45.182.32.165

У меня есть текстовый файл со списком 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.

Заранее благодарю.

0
задан 5 November 2018 в 21:45
2 ответа

Спасибо за вашу помощь.

Увы, ни одно из приведенных выше предложений не помогло мне.

После долгого чтения и экспериментов

мне пришлось добавить -r ( чтобы активировать регулярное выражение) перед -i, и это тот формат, который я использовал для регулярного выражения, который, кажется, работает.

sed -r -i '' '/^120[.pting152[.pting[0-9 ] {1,3} [.] [0-9] {1,3} / d '/ path / to / some / file

, чтобы удалить IP 120.152.35.192 из файла "file"

I протестировал регулярное выражение на «Тренере Regedx», это кажется действительным.

Однако я был бы рад любым дополнительным данным и предложениям по уточнению вышесказанного.

С уважением

1
ответ дан 4 December 2019 в 15:48

Я думаю, ваша проблема в том, что . работает как подстановочный знак, соответствующий любому символу, вместо этого используйте \. который соответствовал бы литералу . .

К сожалению, я не знаю различий с 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

0
ответ дан 4 December 2019 в 15:48

Теги

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