Получить только первую часть grep: получить ip из ifconfig - PullRequest
1 голос
/ 17 апреля 2019
ifconfig | grep -m1 "inet addr" 

Дает мне

inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0

Однако мне нужен только ip, который равен 172.30.1.6.Как я могу это сделать?Обратите внимание, что я должен использовать ifconfig, поскольку это встроенная система с ограниченными функциями.

Ответы [ 8 ]

5 голосов
/ 17 апреля 2019

Вынь ножницы, пора сокращать.

echo inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0 | cut -d : -f 2 | cut -d " " -f 1
4 голосов
/ 17 апреля 2019

Если все, что вы хотите сделать, это получить IP-адрес, возможно, есть более простые способы добиться этого с помощью, скажем, hostname -i (ссылка Какая команда терминала для получения только IP-адреса и ничего больше? )

Поскольку другие упоминают cut и awk, я предоставлю решение с использованием sed:

echo "inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0" | sed -e "s/.*\(addr:[^ ]*\) .*/\1/"

addr:172.30.1.6

echo "inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0" | sed -e "s/.*addr:\([^ ]*\) .*/\1/" 

172.30.1.6
4 голосов
/ 17 апреля 2019

Один из способов сделать это ..

ifconfig | grep -m1 "inet addr" | awk '{print $2}' | awk -F: '{print $2}'
2 голосов
/ 17 апреля 2019

Это все, что вы пытаетесь сделать?

awk -F'[: ]' '/inet addr/{print $3; exit}'

Например, используйте cat file вместо ifconfig:

$ cat file
inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0

$ cat file | awk -F'[: ]' '/inet addr/{print $3; exit}'
172.30.1.6
2 голосов
/ 17 апреля 2019

Использовать вырезать с разделителем

| cut -d':' -f 2 | cut -d' ' -f 1
1 голос
/ 17 апреля 2019

Вот способ сделать это с помощью одной команды 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 (которая просто печатает всю строку), просто чтобы показать эффект других частей в изоляции .

1 голос
/ 17 апреля 2019

Использование оператора регулярных выражений Bash =~:

$ [[ $(ifconfig | grep -m1 "inet addr") =~ [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ ]] && echo ${BASH_REMATCH[0]}
172.30.1.6

Обновление : Что-то еще лучше в комментариях.

1 голос
/ 17 апреля 2019

Просто используйте команду cut .

ip a | grep -m1 "inet addr" | cut -d':' -f 2 | cut -d' ' -f 1 

Я также советую вам изучить использование других команд, таких как: wc, sed, tr, sort, uniq .Они помогут манипулировать выводом, как вам угодно.Вот небольшой урок, где мы представляем вам все эти команды: https://www.javatpoint.com/linux-filters

Я надеюсь помочь вам.

...