【问题标题】:How to terminal output command pipe to input of grep and using regular expression?如何将输出命令管道终端到 grep 的输入并使用正则表达式?
【发布时间】:2025-12-20 15:05:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: regex grep pipe


    【解决方案1】:

    \d 不被 grep 理解,你可以使用 [0-9][[:digit:]]。不幸的是,正则表达式有很多方言。您还必须逃脱{}()。以下对我有用

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

    【讨论】:

      【解决方案2】:

      两件事:

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

      其次,正如前面所指出的,-d 并非所有版本的 grep 都可以识别。我发现以下方法可行:由于 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 的确切输出如何。它将问题分解为两个较小的问题,这通常是一个不错的策略。

      【讨论】:

      • 可以单独打印正则表达式中的匹配组吗?
      • @SGSVenkatesh 请参阅this question 和相关答案。如果这还不够,请考虑提出更具体的问题。