Есть у меня задача - надо файл содержащий в троках 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"
Но вывод корректен не для всех адресов.
Может кто с перлом поможет?
>[оверквотинг удален]
> Файл содержит такие строки:
> 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 тут не сможет ничего сделать. Надо что-нибудь серьезное для парсинга. Скорее всего надо будет заюзать перл.
Не линканете че-нить дельное?
> Не пойдет. Думается bash тут не сможет ничего сделать.Да, щаззз....
$ cat rxip
#!/bin/bashdata() {
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 отличный тяжёлый кирпич!
> Скорее всего надо будет заюзать перл. Не линканете че-нить дельное?
Смысл линковать??
=
> Может кто с перлом поможет?Может. Там же выше есть какие-то ссылки.
=
> Да, щаззз....А такое как вы объясните?
"** qwerty-ab-1.222.155.211.110
1.222.155.2"Вы сами читаете то, что пишете?
>> Да, щаззз....
> А такое как вы объясните?"Даю научное объяснение: бывает."(ц)
> "** 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 заказчик?
Настоящий-то он может настоящий, но вы же видите что на входе, и что передняя единица должна фильтроваться.Я не заказчик, я попросил бы :)
Подумал я сделать так: заменить точки на пробелы (sed 's/\./ /g' $1 | grep -v :), чтобы можно было отфильтровать столбцы содержащие только! цифры. Чтобы без тире всяких. awk должно с этим справиться.И еще, надо бы маски отфильтровать, то есть все что имеет в первых двух октетах 255.
Что скажете?
как то так:
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
Неа, не так. Не пойдет. "1.222.155.211" это как называется?
> Неа, не так. Не пойдет. "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'
Да не парься ты так, пусть товарищь подождёт волшебного перл скрипта с подключенным libastral
> Да не парься ты так, пусть товарищь подождёт волшебного перл скрипта с
> подключенным libastralБомр-у делать нечего, хоть какое-то развлечение =)
Спасибо. Все как надо отфильтровалось.
> Спасибо. Все как надо отфильтровалось.Ну а написать чем отфильтровалось???