У меня работают различные сценарии 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.
Заранее благодарю.
Спасибо за вашу помощь.
Увы, ни одно из приведенных выше предложений не помогло мне.
После долгого чтения и экспериментов
мне пришлось добавить -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», это кажется действительным.
Однако я был бы рад любым дополнительным данным и предложениям по уточнению вышесказанного.
С уважением
Я думаю, ваша проблема в том, что .
работает как подстановочный знак, соответствующий любому символу, вместо этого используйте \.
который соответствовал бы литералу .
.
К сожалению, я не знаю различий с 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