Вот способ сделать это с помощью одной команды sed
, исключив вызов grep
:
ifconfig | sed -n '/inet addr/{s/^.*inet addr:\([^ ]*\).*$/\1/p;q}'
Здесь происходит несколько вещей:
sed -n
говорит sed
не печатать каждую строку, как обычно
/inet addr/
- это адрес sed
- он указывает sed
работать только со строками, содержащими "inet addr"
- Скобки
{
и }
определяют блок команд, которые должны быть выполнены, с командами, разделенными ;
- Команда
s
довольно проста - она просто захватывает IP и заменяет всю строку только IP
- Флаг
p
в конце команды s
указывает sed
напечатать результат подстановки. Это необходимо, потому что мы вызвали sed
с опцией -n
.
- Команда
q
указывает sed
выйти, так что она обрабатывает только первую строку 1039 *, содержащую "inet addr"
.
Использование опции -n
, адреса /inet addr/
, флага p
в команде s
и команды q
, по сути, имеет тот же эффект, что и grep -m1 "inet addr"
, что делает вызов grep
ненужно. На самом деле стоит отметить, что следующие команды выдают одинаковый вывод:
> ifconfig | grep -m1 "inet addr"
inet addr:192.168.1.1 Bcast:192.168.2.255 Mask:255.255.255.0
> ifconfig | sed -n '/inet addr/{p;q}'
inet addr:192.168.1.1 Bcast:192.168.2.255 Mask:255.255.255.0
Здесь я опустил часть s/pattern/replacement/p
команды sed
и заменил ее на команду p
(которая просто печатает всю строку), просто чтобы показать эффект других частей в изоляции .