sed + bash сортировка

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

korneeva
Сообщения: 3

sed + bash сортировка

Сообщение korneeva » 21.09.2014 20:33

Здравствуйте!

имеется файл1 вида:
....
192.168.160.8.192.23.151.62
127.168.160.2.167.25.152.67
192.168.160.3.217.131.31.20
192.168.160.4.64.33.1.2
....

и файл2 вида:
...
32
28
24
32
...

На выходе необходимо получить:
192.168.160.8/32 192.23.151.62
127.168.160.2/28 167.25.152.67
192.168.160.3/24 217.131.31.20
192.168.160.4/32 64.33.1.2

В моей голове это может быть реализовано следующим образом (я взяла за пример первую строку 192.168.160.8.192.23.151.62):
1) sed выводит только начало строки, в которой содержится ххх.ххх.ххх.ххх, цифр после точки может быть от 1 до 3, точек всегда 3
получиться должно - 192.168.160.8
2) на выходе получится файл с IP, соединяю его с файл2, нечто вроде:

Код: Выделить всё

paste -d\/ файл1_после_sed файл2 > файл3

получиться должно 192.168.160.8/32
3) далее берем исходный файл1 и теперь вырезаем sed'ом первый IP-адрес в строке, оставляя второй. на выходе файл4
получиться должно 192.23.151.62
4) И склеиваем его, как во втором пункте

Код: Выделить всё

paste -d\  файл3 файл4 > файл5

результат - 192.168.160.8/32 192.23.151.62
Но по-моему конструкция очень громоздка, и при этом, я не знаю как сделать пункты 1 и 3 на sed

Мне кажется наверняка можно сделать всё проще (если нет, то подскажите, пожалуйста, как правильно написать пункты 1 и 3).
Буду благодарна за любой совет.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: sed + bash сортировка

Сообщение /dev/random » 21.09.2014 20:41

Проще сначала склеить как есть, а потом обработать одним вызовом sed.
Спасибо сказали:

korneeva
Сообщения: 3

Re: sed + bash сортировка

Сообщение korneeva » 21.09.2014 21:15

/dev/random писал(а):
21.09.2014 20:41
Проще сначала склеить как есть, а потом обработать одним вызовом sed.


То есть получится, например, следующий массив:
...
192.168.160.8.192.23.151.62/32
127.168.160.2.167.25.152.67/28
192.168.160.3.217.131.31.20/24
192.168.160.4.64.33.1.2/32
...

Как правильно обработать строки в данном случае через sed?
Логика ведь такая - вместо четвертой точки в строке вставить три последних символа строки + пробел.
Буду признательная за подсказку, если честно, не знаю как реализовать это.

Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: sed + bash сортировка

Сообщение /dev/random » 21.09.2014 21:19

sed 's/\([^.]*\.[^.]*\.[^.]*\.[^.]*\)\.\(.*\)\(\/.*\)/\1\3 \2/'
Спасибо сказали:

korneeva
Сообщения: 3

Re: sed + bash сортировка

Сообщение korneeva » 21.09.2014 21:39

/dev/random писал(а):
21.09.2014 21:19
sed 's/\([^.]*\.[^.]*\.[^.]*\.[^.]*\)\.\(.*\)\(\/.*\)/\1\3 \2/'


Огромное спасибо.
А можете, если не сложно, расписать немножко подробнее всю магию sed в данном случае?
Чтобы я поняла как именно он это делает.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: sed + bash сортировка

Сообщение /dev/random » 21.09.2014 22:19

korneeva писал(а):
21.09.2014 21:39
Огромное спасибо.
А можете, если не сложно, расписать немножко подробнее всю магию sed в данном случае?
Чтобы я поняла как именно он это делает.

s/ - поиск и замена. Начало выражения поиска
\( - начать запоминать подстроку (1)
[^.]*\.[^.]*\.[^.]*\.[^.]* - сколько угодно не-точек, точка, сколько угодно не-точек, точка, сколько угодно не-точек, точка, сколько угодно не-точек
\) - закончить запоминать подстроку (1). В подстроке - первый IP
\. - точка (если бы не было бэкслэша, означала бы "любой символ", а так это просто точка)
\( - начать запоминать подстроку (2)
.* - любые символы, столько, сколько можно захватить, не провалив оставшейся части выражения. В данном случае - до слэша.
\) - закончить запоминать подстроку (2). В подстроке - второй IP
\( - начать запоминать подстроку (3)
\/ - слэш (опять же, экранирован бэкслэшем, чтобы потерял специальное значение)
.* - любые символы. Поскольку выражение заканчивается, берутся все символы до конца строки
\) - закончить запоминать подстроку (3). В подстроке - слэш и число (маска)
/ - конец выражения поиска, начало выражения замены
\1\3 \2 - первая запомненная подстрока, третья, пробел, вторая
/ - конец выражения замены
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sed + bash сортировка

Сообщение drBatty » 22.09.2014 02:10

мой вариант:

$

sed 'R f2' f1|sed -r 'N;s-(([^.]+\.){3})([^.])\.(.*)\n(.*)-\1\3/\5 \4-' 192.168.160.8/32 192.23.151.62 127.168.160.2/28 167.25.152.67 192.168.160.3/24 217.131.31.20 192.168.160.4/32 64.33.1.2



f1 и f2 это файлы входные.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: