inet
UP 어댑터에서 값을 반환하려고 했습니다 ip addr
.
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:19:21:f5:04:42 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global enp0s7
valid_lft forever preferred_lft forever
inet6 fe80::4672:94c8:d31b:a04a/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 52:54:00:29:38:4d brd ff:ff:ff:ff:ff:ff
나는 그것을 찾기 위해 이 정규식을 가지고 있지만 grep이 예상하는 대로 전체 줄을 반환합니다.
([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}
다음을 반환합니다.
inet 192.168.1.100/24 brd 192.168.1.255 scope global enp0s7
내가 하고 싶은 일은오직192.168.1.100
(뒤에 있는 IP )를 반환합니다 inet
. grep이 어떻게든 할 수 있나요? 그렇지 않다면 올바른 접근 방식은 무엇입니까?
편집: 좋습니다. 스크립트의 관련 부분은 다음과 같습니다.
NUMOFNETWORKADAPTERS="$(ip addr | grep -Pc '[0-9]{1}: ')"
IPOFACTIVEADAPTER="$(ip addr | grep -Pc '(?<=state UP(.+\n){2,$NUMOFNETWORKADAPTER}? inet )[^/]{1,15}')"
echo "LOCAL IP: $IPOFACTIVEADAPTER"
하지만 이렇게 하면 lookbehind assertion is not fixed length
오류가 발생합니다.
답변1
grep
grep
PCRE가 활성화되어 있고 -o
너비가 0인 역방향 일치를 사용하여 IP 주소를 얻어 inet
그 뒤의 IP를 찾아 일치시킬 수 있지만 여기서는 아마도 최선의 선택은 아닐 것입니다.
ip addr | grep -Po '(?<=inet )[^/]+'
"부팅된 장치의 inet 주소 가져오기"에 대한 여러 줄 질문의 경우 다음과 같습니다.
ip link | awk -F: '/state UP/{print $2}' \
| while read updev; do \
ip addr show $updev | grep -Po '(?<=inet )[^/]+'; done
더 적절할 수도 있습니다.
답변2
실제로 정규식은
([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}
먼저 제안하신 건,일하다, 적절한 환경과 Perl을 사용하여:
$ perl -l -0 -ne 'print $& if /([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}/' < output_of_your_ip_addr
192.168.1.100
-0
파일을 한 줄씩 읽지 않고 전체로 읽고 일치하는 부분( $&
왼쪽 부분을 제거한 후 남은 부분)을 포함합니다.\K
Perl을 사용할 수 있다면 나는 다음과 같이 쓸 것입니다.
ip addr | perl -l -0ne 'print $1 while /state UP.*?inet ([0-9.]+)/sg'
모든 일치 항목을 인쇄합니다. ( 첫 번째 일치 항목만 가져오도록 변경합니다. while
첫 번째 일치 항목을 포함합니다.)if
$1
()