[РЕШЕНО] Получить адрес пира ppp из вывода команды

Здравствуйте!
Я настроил l2tp\ipsec через strongswan, все работает, ppp поднимается
Мне нужно из такого вывода команды (ip r)

default via 192.168.4.1 dev br0 proto dhcp src 192.168.4.10 metric 1024
172.16.253.196 dev ppp0 proto kernel scope link src 172.16.253.195
192.168.4.0/24 dev br0 proto kernel scope link src 192.168.4.10 metric 1024
192.168.4.1 dev br0 proto dhcp scope link src 192.168.4.10 metric 1024
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
получить адрес link src у ppp0 (в данном случае 172.16.253.195) т.к. при каждом подключении он разный, для того, чтобы добавить через него маршруты в подсеть за vpn шлюзом
Это делается каким-то магическим образом через sed, но правда, когда я вижу регекспы у меня глаза кровят))
Помогите пожалуйста составить нужный регексп :)
Ну или может есть более красивый способ это сделать?
Vitaly, навскидку ... имеем файл test
cat test
default via 192.168.4.1 dev br0 proto dhcp src 192.168.4.10 metric 1024
172.16.253.196 dev ppp0 proto kernel scope link src 172.16.253.195
192.168.4.0/24 dev br0 proto kernel scope link src 192.168.4.10 metric 1024
192.168.4.1 dev br0 proto dhcp scope link src 192.168.4.10 metric 1024
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
вытаскиваем из него нужное
grep ppp0 test | sed 's|.*src||'
172.16.253.195
Ошибки не исчезают с опытом - они просто умнеют
vasek
Vitaly, навскидку … имеем файл test
cat test
default via 192.168.4.1 dev br0 proto dhcp src 192.168.4.10 metric 1024
172.16.253.196 dev ppp0 proto kernel scope link src 172.16.253.195
192.168.4.0/24 dev br0 proto kernel scope link src 192.168.4.10 metric 1024
192.168.4.1 dev br0 proto dhcp scope link src 192.168.4.10 metric 1024
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
вытаскиваем из него нужное
grep ppp0 test | sed 's|.*src||'
172.16.253.195
Вот так
ip r | grep ppp0 | sed 's|.*src||'
работает без промежуточного файла, спасибо!
Vitaly
без промежуточного файла
просто предложил как способ использования sed, хотя более понятно использование awk ... а уж как использовать глобально, это уже другой вопрос

PS - один нюанс - правильнее прописывать link src вместо src - может встретиться сочетание src - хотя в данном случае это исключено.
Ошибки не исчезают с опытом - они просто умнеют
Vitaly
Это делается каким-то магическим образом через sed, но правда, когда я вижу регекспы у меня глаза кровят))
Помогите пожалуйста составить нужный регексп :)
Ну или может есть более красивый способ это сделать?

Вдогонку..

sed всё же для замены части строк, а для просто вывода части строки, я использую конструкции попроще, когда вывод формализован - есть структура, например:
ip r | grep ppp0 | cut -d" " -f9
или
ip r | awk '/ppp0/ {print $9}'
Первое по расходу памяти и по универсальности будет предпочтительнеe.
Nebulosa
sed всё же для замены части строк
sed - это потоковый редектор (согласно DOC - Sed is a stream editor) и, следовательно, возможностей у него на порядок больше.
Но, конечно, использование sed для большинства затруднительно и требует его основательного изучения ... и в большинстве случаев проще использовать awk вместо sed , о чем и писал выше, но нужно помнить о нюансах, точнее, быть уверенным, что формат обрабатываемой строки не меняется. Используя же sed, можно вытащить любое заданное слово не опасаясь, что формат строки может измениться.
Ошибки не исчезают с опытом - они просто умнеют
vasek
использование sed для большинства затруднительно и требует его основательного изучения … в большинстве случаев проще использовать awk вместо sed
Да ладно... gawk - уже целый язык для обработки текста, а базовый sed - ничего сложного, тем более, что примеров в сети на любой случай хватает.
Кстати, давно удивляет, что прописывают именно симлинк (awk) вместо того, чтобы напрямую использовать gawk:
$ file /usr/bin/awk
/usr/bin/awk: symbolic link to gawk
ну типо для совместимости, да...
vasek
sed - это потоковый редектор (согласно DOC - Sed is a stream editor) и, следовательно, возможностей у него на порядок больше.
Спору нет, он очень мощный, но если исходить принципа KISS - если тебе просто нужна часть определённой строки, то надо просто выбрать нужную и порезать её, а не преобразовывать её удалением лишнего. Вот если тебе надо изменить часть строки в файле - вот тут Sed предстаёт во всей красе:

sudo sed -i 's/#en_GB.UTF-8/en_GB.UTF-8/' /etc/locale.gen
Что-то элегантней и проще врядли придумать..

Для каждой задачи свой инструмент, вот и всё.
ip r | grep -oP '(?=.*ppp0)((\d+\.){3}\d+)'
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE
 
Зарегистрироваться или войдите чтобы оставить сообщение.