正如标题所说,我想在windows中将ip地址与批处理匹配,请告诉我该怎么做?
我看到“ findstr ”可以与“ [0-9] ”这样的正则表达式匹配,但是“findstr”如何匹配它出现一到三次?
5 回答
由于findstr
的正则表达式支持有点……过时,您通常不能使用您在网络上找到的大多数正则表达式。以下匹配四行数字,以点分隔:
ipconfig | findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"
但是,如果您只对地址感兴趣而不是子网掩码,则可能需要使用
ipconfig | findstr /r "Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"
是的,if 也会匹配Address: 232345.534.78678.345
显然不是 IP 地址的东西。但通常ipconfig
不会吐出这样的字符串。
FINDSTR 是唯一支持正则表达式的本机批处理实用程序。但是支持非常有限且不标准。唯一支持的重复表达式是*
. 此外,它被限制为最多 15 个字符类术语(请参阅Windows FINDSTR 命令有哪些未记录的功能和限制?)。因此,我认为不可能开发出精确匹配 IP 地址的本地批处理正则表达式。
您可以留在本机 Windows 实用程序中并使用 Power Shell,或者您可以通过 CSCRIPT 命令使用 JScript 或 VBScript。这三个都有更好的正则表达式支持。
或者,您可以下载任意数量的 Unix 实用程序的 Windows 端口,其中许多是免费的。GnuWin32 是一个很好的资源(包括 grep):http ://gnuwin32.sourceforge.net/
如果您的 findstr 命令的输入不应该是 ipconfig 的结果,您可以使用以下代码行在文本或 csv 文件中查找 ip 地址。
findstr /r "\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>" filename.txt
它为用户 Joey 的回答添加了元字符。“\<”开头, “>”结尾。即使这样的字符串可能不是很常见(或不太可能发生),这也可以确保没有类似 ip 地址格式但在结尾和/或开头带有字母字符的字符串(例如 A198.252.206。 16 或 198.252.206.16A) 被退回。
一个简单的正则表达式字符串将是
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9])|25[0-5]
与允许的 IP 地址范围完全匹配。
编辑:根据下面的评论和findstr信息中的正则表达式,修改上面的正则表达式[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]
以匹配 IP 地址。显然FINDSTR
,正则表达式解释确实受到限制。
tldr;
这将属于标题的“任何其他方法”部分,但我在批处理命令中使用了 for 循环以及 findstr 来获得我想要的 IP。在我的例子中,我将 IP 设置为一个名为 IP 的环境变量。
这是命令:
for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i
对于那些想知道这一切意味着什么的人,请继续阅读
例如,大多数命令ipconfig
只打印出你所有的 IP 地址,我需要一个特定的地址,在我的情况下是用于我的以太网网络适配器。
netsh interface ipv4 show interfaces
您可以使用该命令查看网络适配器列表。大多数人需要 Wi-Fi 或以太网。
您将在命令提示符的输出中看到这样的表:
Idx Met MTU State Name
--- ---------- ---------- ------------ ---------------------------
1 75 4294967295 connected Loopback Pseudo-Interface 1
15 25 1500 connected Ethernet
17 5000 1500 connected vEthernet (Default Switch)
32 15 1500 connected vEthernet (DockerNAT)
在名称栏中,您应该找到您想要的网络适配器(即以太网、Wi-Fi 等)。
如前所述,我对Ethernet
我的情况很感兴趣。
要获取该适配器的 IP,我们可以使用 netsh 命令:
netsh interface ip show config name="Ethernet"
这给了我们这个输出:
Configuration for interface "Ethernet"
DHCP enabled: Yes
IP Address: 169.252.27.59
Subnet Prefix: 169.252.0.0/16 (mask 255.255.0.0)
InterfaceMetric: 25
DNS servers configured through DHCP: None
Register with which suffix: Primary only
WINS servers configured through DHCP: None
(出于安全原因,我伪造了上面的实际 IP 号)
findstr
我可以使用ms-dos 命令提示符中的命令进一步指定我想要的行。在这里,我想要包含字符串的行IP Address
。
netsh interface ip show config name="Ethernet" | findstr "IP Address"
这给出了以下输出:
IP Address: 169.252.27.59
然后,我可以使用for
允许我解析文件(或在这种情况下为多行字符串)的命令,并根据分隔符和我感兴趣的项目编号拆分字符串的内容。
请注意,我正在寻找第三项 (tokens=3),并且我正在使用空格字符和:
分隔符 ( delims=:
)。
for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i
循环中的每个值或标记都作为变量 %i 打印出来,但我只对第三个“标记”或项目(因此tokens=3
)感兴趣。请注意,我必须逃避|
and=
使用^
在for
命令的末尾,您可以指定一个命令以使用返回的内容运行。在这种情况下,我使用set
将值分配给名为IP
. 如果您愿意,您也可以只回显该值或您喜欢的任何内容。
这样,您将获得一个环境变量,其中将首选网络适配器的 IP 地址分配给环境变量。很整洁吧?
如果您有任何改进的想法,请发表评论。