您使用了POSIX ERE模式,但没有通过使用POSIX ERE样式的-E
选项grep
。因此,grep
使用POSIX BRE代替,您需要转义{n,m}
量词(...)
并将其解析为特殊的正则表达式运算符。
请注意,您需要转义a,.
以便它只能与文字点匹配。
要使模式以grep
您希望的方式工作,可以使用:
grep -E '([0-9]{1,3}\.?){4}' # POSIX ERE
grep '\([0-9]\{1,3\}\.\?\)\{4\}' # POSIX BRE version of the same regex
观看在线演示。
但是,此正则表达式也将匹配几个数字的字符串,因为.
可选。
您可以通过展开模式来解决它
grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' # POSIX ERE
grep '[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}' # POSIX BRE
参见另一个演示。
基本上,它匹配:
[0-9]{1,3}
-1至3次出现的任何ASCII数字(\.[0-9]{1,3}){3}
-3次出现:
\.
-文字 .
[0-9]{1,3}
-1至3次出现的任何ASCII数字为了确保只匹配有效的IP,您可能需要使用更精确的IP匹配正则表达式:
grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}\b' # POSIX ERE
请参阅此在线演示。
您可能会进一步调整单词边界(可以是\<
/\>
或\b
等等)。
要提取IP使用-o
选项,请使用grep
:grep -oE 'ERE_pattern' file
/ grep -o 'BRE_pattern' file
。
该正则表达式不会工作。改用它。
@ Olian04:我理解您的意思,我只是将OP regex转换为POSIX BRE / ERE。编辑。
@ Olian04或者短一点:
([0-9]{1,3}\.){3}[0-9]{1,3}
。不过,这并不会捕获损坏的IP地址(例如256.256.256.256)。@VictorZamanian您可能想使用更精确的IP匹配正则表达式。答案仅指出了如何解决当前的OP方法。匹配IP的方法更多,而所有方法都取决于用例。