如何使用“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" > %tmp%\tmp.txt
然后set /p ip<%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中的任何其他批处理方法的主要内容,如果未能解决你的问题,请参考以下文章