Как вы извлекаете IP-адреса из файлов, используя регулярные выражения в оболочке Linux? - PullRequest
56 голосов
/ 09 января 2009

Как извлечь текстовую часть с помощью регулярных выражений в оболочке Linux? Допустим, у меня есть файл, где в каждой строке указан IP-адрес, но в другой позиции. Какой самый простой способ извлечь эти IP-адреса, используя обычные инструменты командной строки Unix?

Ответы [ 18 ]

0 голосов
/ 10 марта 2018

Все здесь используют действительно длинные регулярные выражения, но на самом деле понимание регулярного выражения POSIX позволит вам использовать небольшую команду grep, например, для печати IP-адресов.

grep -Eo "(([0-9]{1,3})\.){3}([0-9]{1,3})"

(примечание) Это не игнорирует недействительные IP-адреса, но это очень просто.

0 голосов
/ 29 июля 2017

Все предыдущие ответы имеют одну или несколько проблем. Принятый ответ позволяет IP-номера, такие как 999.999.999.999. В настоящее время второй по популярности ответ требует префикса с 0, например 127.000.000.001 или 008.008.008.008 вместо 127.0.0.1 или 8.8.8.8. У Apama это почти правильно, но это выражение требует, чтобы ipnumber был единственным в строке, без начального или конечного пробела, а также он не мог выбирать ip из середины строки.

Я думаю, правильное регулярное выражение можно найти на http://www.regextester.com/22

Поэтому, если вы хотите извлечь все ip-адреса из файла, используйте:

grep -Eo "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" file.txt

Если вам не нужны дубликаты, используйте:

grep -Eo "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" file.txt | sort | uniq

Пожалуйста, прокомментируйте, если в этом регулярном выражении все еще есть проблемы. Легко найти много неправильных регулярных выражений для этой проблемы, я надеюсь, что у этого нет реальных проблем.

0 голосов
/ 02 декабря 2015
cat ip_address.txt | grep '^[0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[,].*$\|^.*[,][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[,].*$\|^.*[,][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}$'

Предположим, что файл разделен запятой и положение ip-адреса в начале, конце и где-то посередине

Первое регулярное выражение ищет точное соответствие IP-адреса в начале строки. Второе регулярное выражение после или ищет ip-адрес в середине. Мы сопоставляем его таким образом, что число, которое следует, должно быть ровно от 1 до 3 цифр. В этом случае могут быть исключены ложные ips, такие как 12345.12.34.1.

Третье регулярное выражение ищет IP-адрес в конце строки

0 голосов
/ 14 сентября 2015

Если вам не предоставлен конкретный файл, и вам нужно извлечь IP-адрес, тогда мы должны сделать это рекурсивно. Команда grep -> Поиск текста или файла для соответствия данной строке и отображение соответствующей строки.

grep -roE '[0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3} '| grep -oE '[0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}'

-r -> Мы можем искать по всему дереву каталогов, то есть по текущему каталогу и по всем уровням подкаталогов. Обозначает рекурсивный поиск.

-o -> Печатать только соответствующую строку

-E -> Использовать расширенное регулярное выражение

Если бы мы не использовали вторую команду grep после канала, мы получили бы IP-адрес вместе с путем, где он присутствует

0 голосов
/ 05 марта 2013

для центов6,3

ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | awk 'BEGIN {FS=":"} {print $2}'

0 голосов
/ 09 января 2009

Вы также можете использовать awk. Что-то вроде ...

awk '{i = 1; if (NF> 0) do {if ($ i ~ / regexp /) print $ i; i ++;} while (i <= NF);} 'file </p>

- может потребоваться очистка. просто быстрый и грязный ответ, чтобы показать, как это сделать с помощью awk

0 голосов
/ 08 апреля 2019

Для тех, кто хочет получить готовое решение для получения IP-адресов из журнала apache и перечисления случаев, когда IP-адрес посещал веб-сайт, используйте эту строку:

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' error.log | sort | uniq -c | sort -nr > occurences.txt

Хороший способ запретить хакеров. Далее вы можете:

  1. Удалить строки менее чем за 20 посещений
  2. Использование regexp cut до одного пробела, поэтому у вас будут только IP-адреса
  3. Используя regexp, вырежьте 1-3 последние цифры IP-адресов, чтобы у вас были только сетевые адреса
  4. Добавьте deny from и пробел в начале каждой строки
  5. Поместить файл результатов как .htaccess
0 голосов
/ 09 января 2009

Я бы предложил Perl. (\ d +. \ d +. \ d +. \ d +), вероятно, добьется цели.

РЕДАКТИРОВАТЬ: просто чтобы сделать его более похожим на законченную программу, вы можете сделать что-то вроде следующего (не проверено):

#!/usr/bin/perl -w
use strict;

while (<>) {
    if (/(\d+\.\d+\.\d+\.\d+)/) {
        print "$1\n";
    }
}

Это обрабатывает один IP на линию. Если у вас более одного IP-адреса в строке, вам нужно использовать параметр / g. man perlretut дает более подробное руководство по регулярным выражениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...