Получить строку по индексу из выходных данных grep

#regex #linux #grep #ip

Вопрос:

Я пытаюсь получить ipv4 — адрес машины. У меня это работает, но есть ли способ указать, что вы хотите получить индекс 2 из возвращенных данных?

 ip a | grep -E -o "([0-9]{1,3}[.]){3}[0-9]{1,3}"
 

Выход

 127.0.0.1
192.168.13.131
192.168.13.255
 

Комментарии:

1. Возможно, используйте head, чтобы получить 2 строки сверху, а затем tail-n1, чтобы получить последнюю строку из них ip a | grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}" | head -n2 | tail -n1 или передать ее в sed и распечатать строку 2 ip a | grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}" | sed -n 2p

Ответ №1:

С awk , пожалуйста, попробуйте следовать, написанному в соответствии с вашей попыткой.

 ip a | 
awk '
  match($0,/([0-9]{1,3}.){3}[0-9]{1,3}/) amp;amp;   count==2{
     print substr($0,RSTART,RLENGTH)
}'
 

Пояснение: Добавление подробного объяснения приведенного выше решения.

 ip a |
##Running ip a command and sending its output to awk as input
awk '
##Starting awk program from here.
  match($0,/([0-9]{1,3}.){3}[0-9]{1,3}/) amp;amp;   count==2{
##Using match function to match IP address and checking if its 2nd time coming.
     print substr($0,RSTART,RLENGTH)
##Printing matching sub string here.
}'
 

Ответ №2:

Один из вариантов-передать его в sed и распечатать вторую строку

 ip a | grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}" | sed -n 2p
 

Другим вариантом может быть использование комбинации головы и хвоста, показывающих первые n элементов с головой, а затем берущих последний элемент из этого результата.

 ip a | grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}" | head -n2 | tail -n1
 

Если -P поддерживается pcre, вы также можете использовать более длинный шаблон, повторяя соответствие ip-номеру n раз с помощью квантора, например {2} , для повторения 2 раза.

Затем используйте K для очистки буфера совпадения и вывода только интересующего ip-адреса.

 ip a | grep -Poz "(?s)A(?:.*?(?:[0-9]{1,3}.){3}[0-9]{1,3}){2}.*?K(?:[0-9]{1,3}.){3}[0-9]{1,3}"
                                                            ^^^ quantifier