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

Posted

技术标签:

【中文标题】如何使用“findstr”匹配 IP 地址?或Windows中的任何其他批处理方法【英文标题】:How to match IP address by using 'findstr'? Or any other method of batch in windows 【发布时间】:2012-04-17 04:10:22 【问题描述】:

    正如标题所说,我想在windows中将ip地址与批处理匹配,请告诉我该怎么做? 我看到“findstr”可以与“[0-9]”之类的正则表达式匹配,但“findstr”如何匹配它出现一到三倍?

【问题讨论】:

好问题。我认为findstr 是不可能的。您可能想要添加您正在使用的cmd.exe 版本。到“后期”为止,这些工具已经进行了相当大的更新。 STATUS_ACCESS_DENIED: (a) findstr 完全独立于cmd 版本,毕竟它是一个单独的程序。 (b) 据我所知,cmd 自 Windows 2000 以来一直没有更新。 @Joey - XP 上的 FINDSTR 与更新的 Windows 之间至少有一个区别:XP 的最大搜索字符串长度为 127 字节,而更新的版本最多支持 511 字节。我不知道 Vista FINDSTR 是否适用于 XP,反之亦然。 dbenham,这对我来说是个新闻(感谢您提供问题/答案的链接——目前正在阅读)。不过,这个限制在这里可能并不适用。 【参考方案1】:

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 命令解析文件(或在本例中为多行字符串)并根据分隔符和我感兴趣的项目编号拆分字符串的内容。

请注意,我正在寻找第三项 (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)。请注意,我必须使用 ^ 转义 |=

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

这样,您将获得一个环境变量,其中您的首选网络适配器的 IP 地址分配给了一个环境变量。很整洁吧?

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

【讨论】:

【参考方案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)。

【讨论】:

当您将变量设置为 IP 并希望验证它是(大致)IP 格式时,这也很有效。在我的情况下:echo %3 | findstr "your-regex" &gt; %tmp%\tmp.txt 然后set /p ip&lt;%tmp%\tmp.txt 只有当它通过正则表达式时才设置变量。谢谢!【参考方案3】:

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/

【讨论】:

谢谢,我没用过GNU,有空可以试试。【参考方案4】:

一个简单的正则表达式字符串是

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

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

【讨论】:

FINDSTR(或任何其他本机批处理实用程序)不支持此正则表达式。它应该适用于 power shell、JScript 或 VBScript。 谢谢。我同意 FINDSTR 在正则表达式解释方面确实受到限制。而且我认为“[0-2][0-9][0-9]”可能只匹配“000”到“299”,而不能像“10.10.10.10”那样匹配。 不错的想法,但它找不到像1.2.3.4 这样的非 3 个数字的 IP 【参考方案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不会吐出这样的字符串。

【讨论】:

谢谢。关于版本,我只是想为自己和我的朋友写一小批,所以我会确保它可以在Win7和XP上运行。感谢您的回答,它确实适用于 ipconfig。 在这两个示例中,搜索模式 [0-9] 不必在不影响功能的情况下(混淆)加倍。 @peet,要避免匹配...之类的字符串。 wowww,你是完全正确的,我没有意识到"*" matches NONE too,认为它至少会是一个 - 这不是真的 - 所以我在吃我自己的话并且绝对坚持相反.谢谢你的解释。 因为“?”不行,ONE 需要写一小段代码using "for" loops to verify at least 1 number and at max 3 are found for each part between at least 4 and max 4 groups divided by "." and inside the loops one could verify the first Group between "None" and "2", the second and third between "1" and "5"!现在真的没有人这样做吗?

以上是关于如何使用“findstr”匹配 IP 地址?或Windows中的任何其他批处理方法的主要内容,如果未能解决你的问题,请参考以下文章

匹配给定 IP 范围/掩码的 IPv4 地址?

电脑经常连不上wi-fi,显示ip地址配置异常该怎么办

python中利用正则表达式匹配ip地址

每个Wi-Fi都有独一无二的IP地址吗?

使用Wi-Fi方式和4G方式将手机接入Internet的区别是啥?

每个Wi-Fi都有独一无二的IP地址吗?