Perl Regex의 출력을 반환합니다.

Perl Regex의 출력을 반환합니다.

inetUP 어댑터에서 값을 반환하려고 했습니다 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

grepgrepPCRE가 활성화되어 있고 -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()

관련 정보