28

私の場合、から引き出されたこの特定の線を考えるとifconfig

inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.255

192.168.2.13おそらく正規表現を使用して、パーツ(ローカルIPアドレス)をどのように抽出できますか?

4

12 に答える 12

60

使用する1つの方法は次のgrepとおりです。

line='inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

結果:

192.168.2.13
192.168.2.256

有効なアドレスのみを選択する場合は、次を使用できます。

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"

結果:

192.168.0.255

awkそれ以外の場合は、たとえば次のように使用して、必要なフィールドを選択します。

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | awk -v OFS="\n" '{ print $2, $NF }'

結果:

192.168.0.255
192.168.2.256


補遺:

単語の境界\b

于 2012-07-14T10:30:59.170 に答える
5

この正規表現を使用する((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\s*netmask)

于 2012-07-14T10:26:30.783 に答える
4

egrepでegrep(基本的にgrep -Eと同じ)を使用できます
。たとえば、「数字」
(この場合はコマンドが長くなりますが、要点はわかります...)などの文字クラスの名前付きグループがあります。

知っておくとよいもう1つのことは、角かっこを使用してパターンを繰り返すことができることです。

ifconfig | egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'

また

ifconfig | egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'


実際のIPアドレスのみを気にする場合は、パラメーター-oを使用して、出力を行全体ではなく、一致したパターンに制限します。

ifconfig | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

...そして、BCastアドレスなどが必要ない場合は、次のgrepを使用できます。

ifconfig | egrep -o 'addr:([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | egrep -o '[[:digit:]].*'

私はあなたがIPv4アドレスについてのみ話していると仮定しました

于 2014-04-08T13:53:39.603 に答える
4

別の方法を追加するだけです。

ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})' 

ローカルホスト以外のすべてのIPを出力します。

于 2015-02-10T17:15:20.100 に答える
3

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

于 2012-07-14T10:25:09.567 に答える
1

コメントするのに十分なレピュテーションポイントがありませんが、Steveの「有効なアドレスのみを選択する」正規表現にバグが見つかりました。私は問題を完全には理解していませんが、私は修正を見つけたと思います。最初のコマンドはバグを示しています。2つ目は、修正を示しています。

$ echo "test this IP: 200.1.1.1" |grep -oE "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
$ echo "test this IP: 200.1.1.1" |grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
200.1.1.1
$
于 2015-02-19T11:39:11.767 に答える
0

を使用する1つの方法sed。最初の命令は行の最初の桁までのすべての文字を削除し、2番目の命令はグループ1(\1)の最初のIPを保存し、すべての行をそれに置き換えます。

sed -e 's/^[^0-9]*//; s/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/'
于 2012-07-14T10:45:31.310 に答える
0

このコードもうまく機能します。

ifconfig | grep Bcast > /tmp/ip1
cat /tmp/ip1 | awk '{ print $2 }' > /tmp/ip2
sed -i 's/addr://' /tmp/ip2
IPADDRESS=$(cat /tmp/ip2)
echo "$IPADDRESS"
于 2014-01-23T12:40:15.117 に答える
0

多分これ、スポーツのためだけの1つのsedコマンド:

    ip -o -4 addr show dev eth0 | sed 's/.* inet \([^/]*\).*/\1/'
于 2015-09-10T13:59:49.293 に答える
0
grep -oE "\b([0-9]{1,3}\.?){4}\b"
于 2018-09-14T09:59:09.780 に答える
0

このコードは、ラズベリーパイゼロwで動作します。

( wlan0を抽出:ifconfig出力からinet 192.168.xyアドレス)

ifconfig出力でパターン「inet192」を検索し、スペース区切り文字を使用して10番目の位置を取得します。

 $> ifconfig |grep 'inet 192'|cut -d' ' -f10

出力: 192.168.1.6

于 2019-01-01T17:27:23.017 に答える
0

Perl正規表現をサポートするgrepを使用する場合:

(your command that pulls mentioned line) | grep -Po 'inet \K[\d\.]+'
于 2019-01-14T07:29:46.237 に答える