Как получить только последний IP из одного или нескольких, разделенных запятой в начале строки - PullRequest
1 голос
/ 28 октября 2010

Я хочу проанализировать файлы журнала, мне нужно получить только последний IP-адрес из одного или нескольких, разделенных запятой в начале строки:

Вот так выглядят линии:

80.250.5.1 - - [26/Oct/2010:13:10:14 +0200] ...
80.250.5.1, 80.250.5.2 somethingA - [26/Oct/2010:13:10:14 +0200] ...
80.250.5.1, 80.250.5.2, 80.250.5.3 - somethingB [26/Oct/2010:13:10:14 +0200] ...

Мне нужно получить:

80.250.5.1 - - [26/Oct/2010:13:10:14 +0200] ...
80.250.5.2 somethingA - [26/Oct/2010:13:10:14 +0200] ...
80.250.5.3 - somethingB [26/Oct/2010:13:10:14 +0200] ...

Примечание: В столбцах «что-то» и «что-то» никогда не бывает запятой, это моя помощь. В следующих столбцах может быть больше запятых после [date].

Я попытался протестировать несколько первых столбцов и удалить их, если в них есть запятая, но проблема в том, что иногда там более 10 IP-адресов.

Это работает для 2 IP-адресов:

awk '{if ($1 ~ /,/) {$1=""}; if ($2 ~ /,/) {$2=""}  }1'

Моя идея состоит в том, чтобы сделать что-то вроде «если перед запятой [есть запятая, удалите все перед запятой, иначе оставьте ее без изменений» ». К сожалению, мои навыки sed / awk недостаточно хороши для этого.

Большое спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 28 октября 2010
sed -r 's/^(([0-9]+\.){3}[0-9]+, )*(.*)$/\3/'

([0-9]+\.){3}[0-9]+) захватывает IP-адрес.

([0-9]+\.){3}[0-9]+, )* повторяет захват до тех пор, пока не останется больше адресов, после которых остается запятая, что означает, что остальная часть строки - это именно то, что нам нужно(обратите внимание, что последний (или единственный) адрес - , а не , за которым следует запятая).

Последний шаг - указать sed заменить целую строку ввода тем, что у него естьв третьей группе скобок (отсюда \3 в конце выражения), что дает нам желаемый результат.

0 голосов
/ 28 октября 2010

Есть ли другие запятые в строке? Если нет, вы можете сделать:

awk -F, '{ print $NF }'

Это оставит начальные пробелы, которые вы можете обрезать, если хотите, используя любой из этих:

awk -F, '{ print $NF }' | sed 's/^ *//'
awk -F, '{ print gensub(/^ */, "", "G", $NF) }'

В awk встроенная переменная NF возвращает количество полей во входной строке, поэтому при печати $ NF будет напечатано последнее поле в строке. Таким образом, если в строке ввода будет больше запятых, вы не получите желаемый результат.

Обратите внимание, что использование одинарных кавычек является критическим (не используйте двойные кавычки, иначе $ NF расширяется оболочкой, а не передается в awk).

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