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

时间:2012-04-03 13:33:39

标签: windows batch-file ip ip-address findstr

正如标题所说,我想在Windows中将ip地址与批处理匹配,请告诉我如何做到这一点?
我看到“ findstr ”可以匹配正则表达式,如“ [0-9] ”,但“findstr”如何匹配它一到三次< / b>吗?

5 个答案:

答案 0 :(得分: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]*"

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

答案 1 :(得分: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 :(得分: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在正则表达式解释中确实有限。

答案 3 :(得分:1)

如果你的findstr命令的输入不应该是 ipconfig的结果, 您可以使用以下代码行在text或csv文件中查找ip-address。

findstr /r "\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>" filename.txt

它将元字符添加到用户Joey的答案中。开头的“\&lt;”  “&gt;”结尾。即使这样的字符串可能不是很常见(或非常不可能 要发生这种情况,确保没有类似ip-address格式的字符串,而是使用 返回结尾和/或开头的字母字符(例如A198.252.206.16或198.252.206.16A)。

答案 4 :(得分:0)

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地址)

我可以在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"') do set IP=%i

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

转义=^

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

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

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