2014-10-27 2 views
2

У меня есть много файлов конфигурации, линии, которые начинаются с ЛИНИЮ слова имеют IP-адресбаш + как захватить IP-адрес из строки

Моя цель, чтобы прочитать строку, которая начала с линией слова из файла и распечатать только IP-адрес

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

пример

grep LINE file1.txt 

LINE /home/Ariate/run.pl "Voda STS 4 Test - " "102841" && ssh 17.77.170.130 -p 2022 



grep LINE file2.txt 

LINE /home/Ariate/run.pl 137.77.170.30 "Voda STS 4 Test - " "102841" && ssh ACTIVE 

пожалуйста, совет, как захватить IP-адрес из строки (решение может быть также с PERL один лайнер)

ожидаемых результатов

echo $IP_FROM_LINE 

17.77.170.130 



echo $IP_FROM_LINE 

137.77.170.30 
+0

HTTP : //stackoverflow.com/q/10161963/725418 – TLP

ответ

1

Используя этот grep -oE:

grep -oE '\d+\.\d+\.\d+\.\d+' file 
17.77.170.130 
137.77.170.30 

ИЛИ еще:

grep -oP '\d+\.\d+\.\d+\.\d+' file 
+0

не работает, я тестировал его с моими примерами. – maihabunash

+0

Показанный результат - копирование/вставка, запустив его на ваших данных. – anubhava

+0

[См. Этот рабочий пример] (http://ideone.com/UUqP8s) Вы также можете попробовать: 'grep -oP' – anubhava

2
perl -MRegexp::Common=net -lne 'print $1 if /^LINE.*\b($RE{net}{IPv4})/' 
+0

@ikegami жадный матч захватит последний ip, если есть более одного на той же линии (и с возможным отступлением?). –

+0

Это вопрос? '. *?' будет возвращаться, добавляя символы, чтобы найти первый. '.* 'будет возвращаться, удаляя символы, чтобы найти последний. – ikegami

0
grep -oE '[0-9]{2,3}(\.[0-9]{2,3}){3}' 

соответствует

17.77.170.130 
137.77.170.30 

или

grep -oP '\d{2}(\.\d{2}){3}' 

если ваш grep поддерживает -P вариант.

оба они работают с данными, которые вы указали.

Но если вы хотите действительно беспокоитесь о том, что должны быть согласованы, используйте

grep -Eo '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' 

, который соответствовал бы excat IP-адреса.

0

Следующие получат Вас желаемый IP-адрес:

grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file 

Чтобы поместить результат в переменном как запрос, вы должны будете перебирать результаты следующим образом:

grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file | 
while read IP_FROM_LINE ; do 
    echo $IP_FROM_LINE 
done 
Смежные вопросы