ifconfig | grep -oP "(?<=inet addr:).*?(?= Bcast)"
当使用 grep 提取一行的一部分时(就像其他一些答案一样),perl 前瞻和后瞻断言是你的朋友。
快速解释是第一个(?<=inet addr:) 和最后一个(?= Bcast) 括号包含必须匹配的模式,但是grep 不会返回匹配这些模式的字符,只有之间的字符返回两个模式并匹配括号集之间的模式.*?。
ifconfig 输出示例:
eth0 Link encap:Ethernet HWaddr d0:67:e5:3f:b7:d3
inet addr:10.0.0.114 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1392392 errors:0 dropped:0 overruns:0 frame:0
TX packets:1197193 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1294730881 (1.2 GB) TX bytes:167208753 (167.2 MB)
Interrupt:18
这将从 ifconfig 输出中提取您的 IP 地址:
ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)"
要将其分配给变量,请使用:
ip=$(ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)")
稍微深入一点的解释:
来自 man grep:
-o 只打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。
-P 将模式解释为 Perl 正则表达式。这是高度实验性的,“grep -P”可能会警告未实现的功能。
来自permonks.org:
(?<=pattern) 是一个积极的后视断言
(?=pattern) 是一个积极的前瞻断言
-o 告诉 grep 只返回与模式匹配的行部分。 grep 不认为后视/前瞻是返回的模式的一部分。 .* 之后的 ? 很重要,因为我们希望它在 .* 模式匹配后寻找下一个前瞻,而不是寻找最后一个前瞻匹配。 (如果我们为 IP 地址添加正则表达式而不是 .*,则不需要这样做,但是,可读性)。