#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 и распечатать строку 2ip 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