Почему grep не умеет групировать?

Кто может объяснить почему grep досихпор не может создавать группы. Зачастую требуется выбраь уникальный кусок а заменить или вывести толко его часть.

Пример получение ip адреса (упрощен).

Логично думать так:
ifconfig | grep '(inet addr\:)(.*)( B') =$2

Реально приходится делать так:
(ifconfig | grep inet | cut -d: -f2 | awk '{printf $1"\n"}')
Кто может обьяснить причину отсутствия групп в грепе?
  • Вопрос задан
  • 3472 просмотра
Решения вопроса 3
@mcleod095
Для начала можно было бы хоть бы в man залезть и посмотреть
GREP(1) GREP(1)

NAME
grep, egrep, fgrep - print lines matching a pattern

SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

DESCRIPTION
Grep searches the named input FILEs (or standard input if no files are named, or the file name - is given) for lines containing a match to the given PAT-
TERN. By default, grep prints the matching lines.

In addition, two variant programs egrep and fgrep are available. Egrep is the same as grep -E. Fgrep is the same as grep -F.

Здесь написано что он работает со строками, я думаю этим все сказано
Ну и если уж не нравится делать длинные конвейеры то изучите awk
ifconfig | awk '/inet/{gsub(/.*:/,"",$2);print $2}'
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Вы зря в ifconfig адреса то смотрите. У него глюков дочерта.

Проще (и надежнее) так:
ip a s | awk '/inet/ {print $2}'
127.0.0.1/8
::1/128
<censored>
192.168.122.1/24
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Точнее, только v4:
ip a s | awk '/inet / {print $2}'
Только v6:
ip a s | awk '/inet6 / {print $2}'
Все адреса:
ip a s | awk '/inet/ {print $2}'
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@tossed
В принципе, ваш вариант:
ifconfig | grep '(inet addr\:)(.*)( B') =$2
вполне логичен и работоспособен с небольшими переделками:

Достаточно включить PCRE и исключить из выдачи все лишнее:
ifconfig | grep -P '(?<=addr:)(.*?)(?=\h)' -o
127.0.0.1
10.100.104.90


Или даже так:
ifconfig | grep -P '(?<=addr:)(.*?)(?=\h)' -o | awk -e '!/^127/{print("RPAFproxy_ips 127.0.0.1 "$1)}'

Но, как правильно говорят выше, ifconfig - не самый лучший способ.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы