如何使用“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中的任何其他批处理方法的主要内容,如果未能解决你的问题,请参考以下文章