cat 文件包含
inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0
我正在使用 sed 提取 ipaddress(192.168.154.102
和127.0.0.1
),如下所示:
sed -ne 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p'
但它只是给出:
5.255.255.0
5.0.0.0
答案1
使用awk
:
$ echo "inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0" | awk '{ split($2, a, ":"); print a[2] }'
192.168.154.102
如果你绝对必须使用sed
,例如:
echo "inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0" | sed 's#.*addr:\([0-9.]*\).*#\1#g'
192.168.154.102
答案2
问题是星号因为正则表达式是尽可能贪婪的并且尽快匹配。这仅仅意味着“.*”将在第一行匹配“几乎所有内容”
inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:2
在第二个
inet addr:127.0.0.1 Mask:25
所以它会打印剩下的内容和你得到的内容。
对于你的情况,我会尝试更具体,例如使用“:”作为分隔符或一些前缀,例如“地址:”或者您可以删除所有字符,但不能点和数字因为 IPv4 地址仅由它们组成。你可以尝试这个命令:
tr -cd '[0-9. ]' < YOUR_FILE
然后您可以继续处理输出。
答案3
使用
sed -n '/inet addr:/s/[^:]\+:\(\S\+\).*/\1/p'
从命令行尝试这个
ifconfig | sed -n '/inet addr:/s/[^:]\+:\(\S\+\).*/\1/p'
输出
192.168.154.102
127.0.0.1
答案4
如果您只想 grep 某些模式,为什么不使用
awk -F'[: ]' '/inet addr:/{ print $4}' file