URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9242
[ Назад ]

Исходное сообщение
"Bash и IP regexp"

Отправлено kamenniygorets , 21-Сен-11 08:12 
Есть у меня задача - надо файл содержащий в троках ip адреса распарсить.
Файл содержит такие строки:

ABC.DEF.123.222.111.32
qwerty-ab-1.222.155.211.110
ip_160.134.54.132_255.255.255.255
aabd-exx3.revb.139.222.176.82.
sysmon1-new.aaa.90.211.111.222.

Нужно отсюда выдрать адреса.

Моего ума хватило на такое "grep -E '([1-9]|(1[0-9]|2[0-2]|3[0-5])).([1-9]|(1[0-9]|2[0-2]|3[0-5])).([1-9]|(1[0-9]|2[0-2]|3[0-5])).([1-9]|(1[0-9]|2[0-2]|3[0-5]))' iplist.txt"
Но вывод корректен не для всех адресов.
Может кто с перлом поможет?


Содержание

Сообщения в этом обсуждении
"Bash и IP regexp"
Отправлено Andrey Mitrofanov , 21-Сен-11 09:22 
>[оверквотинг удален]
> Файл содержит такие строки:
> ABC.DEF.123.222.111.32
> qwerty-ab-1.222.155.211.110
> ip_160.134.54.132_255.255.255.255
> aabd-exx3.revb.139.222.176.82.
> sysmon1-new.aaa.90.211.111.222.
> Нужно отсюда выдрать адреса.
> Моего ума хватило на такое "grep -E '([1-9]|(1[0-9]|2[0-2]|3[0-5])).([1-9]|(1[0-9]|2[0-2]|3[0-5])).([1-9]|(1[0-9]|2[0-2]|3[0-5])).([1-9]|(1[0-9]|2[0-2]|3[0-5]))'
> iplist.txt"
> Но вывод корректен не для всех адресов.

=  =  =  8<  =  =  =
#"Учись, студент!"(с)
oct="([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"

>ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"`

# ..."космические корабли бороздят просторы Большого театра"...
ip2="`echo "$ip"|egrep -o "^$oct\.$oct\.$oct\.$oct$"`"
=  =  =  >8  =  =  =

http://opennet.ru/openforum/vsluhforumID9/7785.html#9

И кстати, ключ -o grep-а может быть полезен в такой ситуации.

> Может кто с перлом поможет?

Может. Там же выше есть какие-то ссылки.


"Bash и IP regexp"
Отправлено kamenniygorets , 21-Сен-11 12:55 
Спасибо за помощь.

"Bash и IP regexp"
Отправлено kamenniygorets , 22-Сен-11 07:39 
Не пойдет. Думается bash тут не сможет ничего сделать. Надо что-нибудь серьезное для парсинга. Скорее всего надо будет заюзать перл.
Не линканете че-нить дельное?

"Bash и IP regexp"
Отправлено Andrey Mitrofanov , 22-Сен-11 09:47 
> Не пойдет. Думается bash тут не сможет ничего сделать.

Да, щаззз....

$ cat rxip
#!/bin/bash

data() {
cat <<EOD
ABC.DEF.123.222.111.32
qwerty-ab-1.222.155.211.110
ip_160.134.54.132_255.255.255.255
aabd-exx3.revb.139.222.176.82.
sysmon1-new.aaa.90.211.111.222.
EOD
}

oct="([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
iprx="($oct\.$oct\.$oct\.$oct)(.*)\$"


data | while read ll; do
echo "** "$ll
  while [[ "$ll" =~ $iprx ]]; do
    ip="${BASH_REMATCH[1]}"
    ll="${BASH_REMATCH[6]}"

    echo "$ip"
    done
  done
$ ./rxip
** ABC.DEF.123.222.111.32
123.222.111.3
** qwerty-ab-1.222.155.211.110
1.222.155.2
** ip_160.134.54.132_255.255.255.255
160.134.54.1
255.255.255.2
** aabd-exx3.revb.139.222.176.82.
139.222.176.8
** sysmon1-new.aaa.90.211.111.222.
90.211.111.2
$ _


>Надо что-нибудь серьезное для парсинга.

Купи себе книжку по бизону и теории компиляторов. Dragon Book отличный тяжёлый кирпич!

> Скорее всего надо будет заюзать перл. Не линканете че-нить дельное?

Смысл линковать??
=
> Может кто с перлом поможет?

Может. Там же выше есть какие-то ссылки.
=


"Bash и IP regexp"
Отправлено kamenniygorets , 23-Сен-11 00:38 

> Да, щаззз....

А такое как вы объясните?
"** qwerty-ab-1.222.155.211.110
1.222.155.2"

Вы сами читаете то, что пишете?


"Bash и IP regexp"
Отправлено Andrey Mitrofanov , 23-Сен-11 10:33 
>> Да, щаззз....
> А такое как вы объясните?

"Даю научное объяснение: бывает."(ц)

> "** qwerty-ab-1.222.155.211.110
> 1.222.155.2"
> Вы сами читаете то, что пишете?

Ни-ког-да!

$ diff -u rxip rxip1
--- rxip        2011-09-22 09:42:26.951679934 +0400
+++ rxip1       2011-09-23 10:21:17.192179505 +0400
@@ -10,7 +10,7 @@
EOD
}

-oct="([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
+oct="(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9][0-9]|[0-9])"
iprx="($oct\.$oct\.$oct\.$oct)(.*)\$"


$ diff -u <( ./rxip ) <( ./rxip1 )
--- /dev/fd/63  2011-09-23 10:23:03.995679806 +0400
+++ /dev/fd/62  2011-09-23 10:23:03.995679806 +0400
@@ -1,11 +1,11 @@
** ABC.DEF.123.222.111.32
-123.222.111.3
+123.222.111.32
** qwerty-ab-1.222.155.211.110
-1.222.155.2
+1.222.155.211
** ip_160.134.54.132_255.255.255.255
-160.134.54.1
-255.255.255.2
+160.134.54.132
+255.255.255.255
** aabd-exx3.revb.139.222.176.82.
-139.222.176.8
+139.222.176.82
** sysmon1-new.aaa.90.211.111.222.
-90.211.111.2
+90.211.111.222
$ _

И да, :) 1.222.155.211 -- таки настоящий ip адрес.

Дальше - меняй постановку задачи (или повторно доводо до). Например, самые правые 4 октета или перед первым октетом не минус, или перед первым только точка, или... Кто тут :-P заказчик?
                                        


"Bash и IP regexp"
Отправлено kamenniygorets , 23-Сен-11 14:44 
Настоящий-то он может настоящий, но вы же видите что на входе, и что передняя единица должна фильтроваться.

Я не заказчик, я попросил бы :)


"Bash и IP regexp"
Отправлено kamenniygorets , 23-Сен-11 01:32 
Подумал я сделать так: заменить точки на пробелы (sed 's/\./ /g' $1 | grep -v :), чтобы можно было отфильтровать столбцы содержащие только! цифры. Чтобы без тире всяких. awk должно с этим справиться.

И еще, надо бы маски отфильтровать, то есть все что имеет в первых двух октетах 255.

Что скажете?


"Bash и IP regexp"
Отправлено x6e6564 , 22-Сен-11 22:56 
как то так:
cat /tmp/qwe | sed -n 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/\n&\n/gp'|grep -v "^255\." |grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
123.222.111.32
1.222.155.211
160.134.54.132
139.222.176.82
90.211.111.222

"Bash и IP regexp"
Отправлено kamenniygorets , 23-Сен-11 00:39 
Неа, не так. Не пойдет. "1.222.155.211" это как называется?


"Bash и IP regexp"
Отправлено x6e6564 , 23-Сен-11 18:02 
> Неа, не так. Не пойдет. "1.222.155.211" это как называется?

Ну дык, не заметил.

для данного условия вроде этого хватает..

cat /tmp/qwe | sed 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/\n&/g' | sed 's/[^0-9]\{1,\}$//' | sed 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$/\n&/' | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sed '/^255\./d'


"Bash и IP regexp"
Отправлено jedi , 02-Окт-11 15:36 
Да не парься ты так, пусть товарищь подождёт волшебного перл скрипта с подключенным libastral

"Bash и IP regexp"
Отправлено x6e6564 , 02-Окт-11 22:57 
> Да не парься ты так, пусть товарищь подождёт волшебного перл скрипта с
> подключенным libastral

Бомр-у делать нечего, хоть какое-то развлечение =)


"Bash и IP regexp"
Отправлено kamenniygorets , 06-Окт-11 06:30 
Спасибо. Все как надо отфильтровалось.

"Bash и IP regexp"
Отправлено izvorot , 06-Окт-11 09:47 
> Спасибо. Все как надо отфильтровалось.

Ну а написать чем отфильтровалось???