Re: Почему sed выдает не только группу но и другой текст ?
26.12.2013 16:10, Alexander Galanin пишет:
On Thu, 26 Dec 2013 15:39:56 +0400
Vladimir Skubriev <skubriev@cvisionlab.com> wrote:
Помогите с sed. Пожалуйста.
#ip a | grep ppp50
6: ppp50: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc
pfifo_fast state UNKNOWN qlen 3
inet 84.51.23.2 peer 80.68.8.17/32 scope global ppp50
Во-первых, ip a show dev ppp50, чтобы обойтись без грепа.
Во первых - спасибо!
#ip a | grep ppp50 | sed -r 's/(.*inet )(.*)( peer.*)/\2/'
6: ppp50: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc
pfifo_fast state UNKNOWN qlen 3
84.51.23.2
Нужно получить ip адрес по интерфейсу.
Во-вторых, указать более точный regexp. Хватит условия "строка без
пробелов и слешей": [^ /]*, т.е. в итоге получится:
ip a show dev ppp50 | grep -E '\<inet\>' | sed -r 's/.*inet ([^ /]*).*/\1/'
Во вторых вопросы :-) :
1. Зачем \< и \> в grep'е почему не просто 'inet' ? или Вы просто только
--extended-regexp пользуетесь ?
2. Я не знал, что можно .*inet без группы написать, точнее что не
обязательно все в группы объединять.
3. ( - группа начинается, [^ /]* - любое количество чего ?
Чем плох мой вариант (после вашего примера)
ip a show dev ppp50 | grep 'inet' | sed -r 's/.*inet (.*) peer.*/\1/'
?
Грепается строка с "inet", чтобы отфильтровать всё постороннее, в т.ч. inet6.
Но надо не забыть обработать случай, когда на интерфейсе несколько адресов.
Меня вполне устарвивает вариант с одним )
--
--
Faithfully yours,
Vladimir Skubriev
Reply to: