grep을 사용하여 adb 쉘을 통해 IP 추출

grep을 사용하여 adb 쉘을 통해 IP 추출

adb shell나는 및 grep(내 Android 장치의 내부 grep)을 사용하여 Android 장치의 로컬 IP 주소를 찾기 위한 플랫폼 독립적인 한 줄 솔루션을 만들려고 합니다 . 작동하는 솔루션이 있지만 뭔가 문제가 있습니다.

그런데, 저는 Powershell 7에서 솔루션을 실행하고 있습니다. 차이가 있다면 말이죠.

이것이 내 해결책입니다.

> adb shell "ip addr show wlan0 | grep -e 'inet[^6]'"
    inet 192.168.0.19/22 brd 192.168.3.255 scope global wlan0

작동하지만 필터링을 위한 문자 클래스로 사용할 수 없으므로 \d더 좋습니다.

내가 선호하는 솔루션은 IP 주소만 표시하고 다른 내용은 표시하지 않는 것입니다. 이것이 내가 할 수 있는 최선이다:

> adb shell "ip addr show wlan0 | grep -o '^    inet [0-9][0-9][0-9].[0-9][0-9][0-9].[0-9]'"
    inet 192.168.0

Android는 제한된 터미널 설정과 함께 제공되는 것으로 보이며 "toybox"를 사용하여 일반적인 bash 도구를 에뮬레이션합니다. 그러나 그것들은 매우 제한적이며 많은 문서를 제공하지 않습니다.

숫자 문자 클래스나 수량자를 사용할 수 없기 때문에 라인만 필터링할 수 있고 을 사용하는 것이 -o정보를 출력하는 유일한 방법입니다. 따라서 내가 선호하는 솔루션은 구현이 사실상 불가능합니다.

이 제한된 도구 세트를 사용하여 로컬 IP 주소를 어떻게 추출합니까?

답변1

표현식의 일부 grep가 아닌 로컬로 실행할 수 있습니다 .adb

$ adb shell "ip addr show wlan0" | 
  grep -o -P  '^ *inet \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
inet 192.168.1.167

거기에 있는 옵션은 을 -P의미하며 이스케이프를 지원하는 데 필요 --perl-regexp합니다 \d.

awk다음과 같은 조합을 사용할 수도 있습니다 cut.

$ adb shell "ip addr show wlan0 | awk '\$1 == \"inet\" {print \$2}' | cut -f1 -d/"
192.168.1.167

$1로컬 쉘이 로컬로 확장되는 것을 방지하기 위해 거기에는 많은 탈출구가 있습니다 .


또는 grep및 같은 기존 도구를 잊어버리고 awkJSON 및 다음을 사용하여 수행하세요 jq.

$ adb shell "ip -j addr show wlan0"  | jq -r '.[]|select(.ifname).addr_info[]|select(.family=="inet").local'
192.168.1.167

관련 정보