如何使用'findstr'匹配IP地址?或Windows中其他任何批处理方法

问题描述 投票:3回答:5

正如标题所述,我想在Windows中将IP地址与批次匹配,请告诉我该怎么做?我看到“ findstr”可以与“ [[0-9]”等正则表达式匹配,但是“ findstr”如何匹配它呢?[[一到三倍?

windows batch-file ip ip-address findstr
5个回答
6
投票
由于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]*"

[是的,如果还可以匹配Address: 232345.534.78678.345之类的东西,这显然不是IP地址。但通常ipconfig不会吐出这样的字符串。

2
投票
FINDSTR是唯一对正则表达式提供任何支持的本机批处理实用程序。但是支持非常有限并且是非标准的。支持的唯一重复表达式是*。此外,它最多限制为15个字符类术语(请参见What are the undocumented features and limitations of the Windows FINDSTR command?)。因此,我认为不可能开发出与IP地址完全匹配的本地批处理正则表达式。

您可以留在本机Windows实用程序中并使用Power Shell,也可以通过CSCRIPT命令使用JScript或VBScript。这三个都具有更好的正则表达式支持。

或者,您可以下载许多Unix实用程序的Windows端口中的任何一个,其中许多都是免费的。 GnuWin32是很好的资源(包括grep):http://gnuwin32.sourceforge.net/


2
投票
如果您的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
投票
简单的正则表达式字符串将是

(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地址范围。

编辑:根据下面的注释和Regular expressions in 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确实在正则表达式解释中受到限制。


0
投票
tldr;

这将属于标题的“任何其他方法”部分,但我在批处理命令中使用了for循环以及findstr来获取所需的IP。就我而言,我将IP设置为称为IP的环境变量。

这里是命令:

for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address" ^| findstr [0-9]') 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地址number)

我可以在ms-dos命令提示符下使用findstr命令进一步指定我想要的行。在这里,我需要包含字符串IP Address的行。

netsh interface ip show config name="Ethernet" | findstr "IP Address"

这将提供以下输出:

IP Address: 169.252.27.59

然后,我可以使用for命令,使我能够解析文件(在这种情况下为多行字符串),并根据分隔符和我感兴趣的项目编号来拆分字符串的内容。

请注意,我正在寻找第三个项目(令牌= 3),并且我使用空格字符和:作为分隔符(delims=:)。

for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address" ^| findstr [0-9]') do set IP=%i

循环中的每个值或令牌都作为变量%i打印出来,但是我只对第三个“令牌”或项目感兴趣(因此tokens=3)。请注意,我必须使用|
转义=^

for命令的末尾,您可以指定要与返回的内容一起运行的命令。在这种情况下,我使用set将值分配给名为IP的环境变量。如果您愿意,也可以仅回显该值或您想要的任何内容。

这样,您将获得一个环境变量,并将您的首选网络适配器的IP地址分配给一个环境变量。很好,是吧?

如果您有任何改进的想法,请发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.