sed 没有给出模式的第一次出现

sed 没有给出模式的第一次出现

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.102127.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

相关内容