How to match IP address by using 'findstr'? Or any other method of batch in windows

喜夏-厌秋 提交于 2019-12-01 22:47:38

Since findstr's regex support is a bit ... dated, you usually can't use most regexes you find on the web. The following matches four runs of digits, separated by dots:

ipconfig | findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"

However, if you're only interested in addresses and not the subnet masks, you might want to use

ipconfig | findstr /r "Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"

And yes, if would also match things like Address: 232345.534.78678.345 which is obviously not an IP address. But usually ipconfig doesn't spit out such strings.

dbenham

FINDSTR is the only native batch utility that has any support for regular expressions. But the support is very limited and non-standard. The only repeat expression supported is *. In addition, it is limited to a maximum of 15 character class terms (see What are the undocumented features and limitations of the Windows FINDSTR command?). So I don't think it is possible to develop a native batch regex that will precisely match an IP address.

You could stay within native windows utilities and use Power Shell, or you could use JScript or VBScript via the CSCRIPT command. All three have much better regex support.

Alternatively you could download any of a number of Windows ports of Unix utilities, many of them free. GnuWin32 is a good resource (includes grep): http://gnuwin32.sourceforge.net/

In case the input of your findstr command should not be the result of ipconfig, you could use the following line of code to look for an ip-address in a text or csv file.

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

It adds to metacharacters to the answer of user Joey. "\<" at the beginning and ">" at the end. Even though such a string might not be very common (or very unlikely to occur) this makes sure that no string in an ip-address-like format but with an alphabetic character at the end and/or the beginning (e.g. A198.252.206.16 or 198.252.206.16A) is returned.

saluce

A simplistic regex string would be

(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]

to match exactly the range of allowable IP addresses.

EDIT: Based on comments below and Regular expressions in findstr information, modify the above regex to [0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9] to match IP addresses. Apparently FINDSTR really is that limited in regular expression interpretation.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!