[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: