САС для поиска и удаления IP с частичным соответствием
У меня есть различные bash-скрипты, которые запускаются, они сканируют файлы журналов на наличие людей, которые пытаются подделать, спамят нас и так далее.
Я боролся с этим в течение нескольких дней, пытаясь понять это.
У меня есть текстовый файл со списком с IP-адресов
Я использую sed для сканирования списка и удаления IP-адресов, таких как наш ip и другие известные диапазоны ips и 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 для правильной работы
Это потому, что я делаю это на машине free bsd.
Заранее спасибо.
3 ответа
Спасибо за помощь.
Увы, ни одно из вышеперечисленных предложений не будет работать для меня.
После долгих чтений и экспериментов
Я обнаружил, что должен был добавить -r (чтобы активировать регулярное выражение) перед -i, и это формат, который я использовал для регулярного выражения, который, кажется, работает.
sed -r -i '' '/^120[.]152[.][0-9][1,3[[.][0-9]]1,3 enj/d' /path/to/some/файл
удалить ip 120.152.35.192 из файла "файл"
Я проверил регулярное выражение на "The Regedx Coach", оно кажется действительным.
Однако я бы приветствовал любые дополнительные материалы и предложения по уточнению вышесказанного.
С уважением
Я думаю, что ваша проблема в том, что .
работает как подстановочный знак, соответствующий любому символу, вместо того, чтобы использовать \.
который будет соответствовать буквальному .
,
К сожалению, я не знаю различий с 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
Кстати: это работает и с версиями команд BusyBox.
Если кто-то еще ищет ответ на этот вопрос, вы можетеgrep -n
диапазон,cut
номер строки, затем передайте его команде для удаления строки.
Есть несколько способов сделать это (в одну строку или по шагам с переменными), но вот онлайн-версия:
grep -nm1 "^192.168.254.0/24" ./blocked_subnets.txt | cut -d \: -f 1 | xargs -n 1 -I {} sed -i "{}d" ./blocked_subnets.txt
если вы используете переменные, вам не нужно использоватьxargs
дляsed
шаг:
N=$(grep -nm1 "^192.168.254.0/24" ./blocked_subnets.txt | cut -d \: -f 1)
sed -i "${N}d" ./blocked_subnets.txt
Вам нужен символ , начинающийся с (каретки), чтобы уловить некоторые угловые случаи, вам также понадобится замена оболочки {} во втором примере, потому что следующий символ - это буква ([a-zA-Z]
, что значит"$Nd"
терпит неудачу). m1
останавливается после 1-го матча.
РЕДАКТИРОВАТЬ:
Да, точка соответствует подстановочному знаку, но она соответствует.
в IP-адресе , и нам также не нужно его экранировать , поэтому предварительная обработка диапазона IP (или IP-адреса) не требуется, просто проверка, и это тоже будет исправлено (возможно, потребуется2>/dev/null
хотя).
ДОПОЛНИТЕЛЬНЫЙ:
Если вы собираетесь выполнить удаление напрямую (или из журнала, содержащегоip
вывод при его добавлении), вам необходимо изменить курсор (^
) символ в пробел (
) персонаж вgrep
match (чтобы уловить те самые угловые случаи).