Как использовать grep для извлечения IP-адресов и строк даты / времени из файла журнала? - PullRequest
1 голос
/ 31 мая 2019

У меня есть файл журнала, который выглядит следующим образом:

May 25 05:34:16 server sshd[1203]: Received disconnect from 192.0.2.2 port 39102:11
May 25 05:34:16 server sshd[1203]: Disconnected from 192.0.2.1 port 39102 

Теперь я хочу извлечь все IP-адреса и строки даты / времени в начале, используя grep. Я уже знаю, как получить ips:

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /log.txt

и даты / время:

grep -o '[A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' /log.txt

но я не знаю, как получить оба одновременно в формате, подобном:

May 25 05:34:16 192.0.2.1

Я прочитал что-то вроде:

 grep -oE 'match1|match2' /log.txt

но это, похоже, не работает.

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

Вы можете использовать свои 2 шаблона в группе захвата и использовать их в замене с помощью sed:

sed -i -E 's#^([A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]).* ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*$#\1 \2#g' log.txt

Это будет соответствовать:

  • ^ Начало строки
  • ([A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]) Ваша дата / время как шаблон
  • .* Соответствует любому символу 0+ раз
  • ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) Соответствует пробелу по вашему IP как шаблон
  • .* Соответствует любому символу 0+ раз
  • $ Конец строки

Результат

May 25 05:34:16 192.0.2.2
May 25 05:34:16 192.0.2.1
0 голосов
/ 01 июня 2019

С любым awk в любой оболочке на любом компьютере UNIX:

$ awk '{print $1, $2, $3, $(NF-2)}' file
May 25 05:34:16 192.0.2.2
May 25 05:34:16 192.0.2.1
0 голосов
/ 31 мая 2019

Печать двух совпадений в одной строке проще с awk, после чего будет напечатана дата (при печати $1,$2,$3 и всех действительных IP-адресов .

gawk  '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/,a);split(a[0],b,".")} b[1]<=255&& b[2]<=255 && b[3]<=255 && b[4]<=255 &&length(a[0]){print $1,$2,$3, a[0]}' log_file
May 25 05:34:16 192.0.2.2
May 25 05:34:16 192.0.2.1

Объяснение: Сначала используйте функцию соответствия, чтобы захватить все строки, имеющие формат digit.digit.digit.digit, и сохранить их в массив с именем "a", а затем разделить захваченный массив (a) на точку (* 1013).*) и проверьте, является ли каждый из них <= 255. Убедитесь, что IP-адрес действителен.

Обратите внимание: здесь используется GNU awk.

Также обратите внимание, что, упомянутое регулярное выражение будет также печатать недействительные IP-адреса (например: 333.222.555.666).

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