Понимание grep -oP … В скрипте

Я пишу небольшой bash-скрипт для Debian. Я хочу найти 3-й октет моего IPv4 и поместить его в переменную «ip1», а последний октет — в переменную «ip2». После некоторых исследований я нашел сценарий, который должен дать мне первый октет, но я не понимаю эту часть:

'(?<=inet )[^.]+' 

Кто-нибудь может объяснить мне это и как я могу адаптировать это к своим потребностям.

Я прочитал это https://explainshell.com/... , так что я знаю, как работает -oP, но до сих пор не понимаю последнюю часть.

ip1=$(ip a show | grep -oP '(?<=inet )[^.]+')
ip2=$(ip a show | grep -oP '(?<=inet )[^.]+')

0
18.04.2019, 00:04
1 ответ

-Pозначает, что grepдолжен использовать синтаксис регулярных выражений Perl, а в Perl (?<=pattern)является «нулевой -положительной шириной -за утверждением », другими словами, якорем который должен появиться перед самим матчем. Таким образом, (?<=inet )[^.]+соответствует непустой -последовательности символов, которые не являются точками ([^.]+), если они следуют за "inet ", другими словами, первому байту различных IP-адресов ваших сетевых интерфейсов, потому что ip address showвыводит такие строки, как inet 127.0.0.1/8 scope host lo.

Это сделано таким образом, потому что опции -oкоманды grepзаставляют выводить совпадение, и вы не хотите, чтобы бит "inet "печатался, даже если он важен для совпадения.

Вопрос в том, что вы можете сделать только с первым байтом ваших различных IP-адресов и почему ip2имеет то же значение, что и ip1. Для чего нужен скрипт?

Для ваших конкретных нужд что-то вроде:

# get last two bytes of IP (assume in 192.168.*. network)
last_two=$(ip a show | grep -oP '(?<=inet 192\.168\.)[^/]+')
# Split result in two
IFS=. read net host <<< $last_two
1
28.01.2020, 03:49

Теги

Похожие вопросы