САС для поиска и удаления 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вывод при его добавлении), вам необходимо изменить курсор (^) символ в пробел ( ) персонаж вgrepmatch (чтобы уловить те самые угловые случаи).

Другие вопросы по тегам