Я пишу небольшой 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 )[^.]+')
-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