grepを使用したadbシェルによるIP抽出

grepを使用したadbシェルによるIP抽出

adb shell私は、grep(私のAndroidデバイスの内部grep)を使用してAndroidデバイスのローカルIPアドレスを見つけるためのプラットフォームに依存しない1行のソリューションを作成しようとしています。動作する解決策がありますが、何か問題があります。

さて、私は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

関連情報