如何终端输出命令管道输入grep并使用正则表达式?

时间:2013-03-29 23:23:20

标签: regex grep pipe

我认为在OSX或Linux上获取IP地址会很容易学会如何使用grep使用正则表达式,但看起来我要么出现语法错误,要么误解了所需内容。

我知道这个正则表达式是正确的,虽然我知道它可能不是一个有效的IP地址,我现在不考虑这个。

(\d{1,3}\.){3}\d{1,3}

所以我不确定为什么这不起作用。

ifconfig | grep -e "(\d{1,3}\.){3}\d{1,3}"

2 个答案:

答案 0 :(得分:3)

两件事:

首先,-e-E之间存在差异:-e只是说“下一个是表达式”,而-E说:“使用扩展常规表述”。根据您使用的grep的确切版本,您需要-E才能使事情正常工作。

其次,如前所述,所有版本的grep都无法识别-d。我发现以下情况有效:因为ip地址是“常规”数字,我们不需要比[0-9]更加花哨的东西来找到它们:

ifconfig | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'

无需转义其他字符(在我的grep版本中 - 使用OSX 10.7.5)

顺便说一句,在测试正则表达式时,您可以考虑使用类似

的内容
echo "10.1.15.123" | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'

确认您的正则表达式是否正常工作 - 无论ifconfig的确切输出如何。它将问题分解为两个较小的问题,这通常是一个很好的策略。

答案 1 :(得分:0)

grep不理解

\d,而是可以使用[0-9][[:digit:]]。不幸的是,正则表达式有许多方言。您还必须逃离{}()。以下适用于我

/sbin/ifconfig | grep -e "\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}"