【问题标题】:How do I grep something and prevent the phrase appearing in the results? [duplicate]如何 grep 某些内容并防止该短语出现在结果中? [复制]
【发布时间】:2020-10-08 22:36:27
【问题描述】:

如何 grep 某些内容并防止该短语出现在结果中?

我试图只从多个系统中获取 MAC 地址,并且只希望结果中的 MAC 地址。

ipmitool lan print | grep "MAC Address             : "
# => MAC Address             : aa:bb:cc:dd:ee:ff

我尽可能使用谷歌尝试添加-oP\K\w+,但由于某种原因,它只能得到 MAC 的前 2 位数字:

ipmitool lan print | grep -oP "MAC Address             : \K\w+"
# => aa

我知道-o 只会显示匹配的文本,这就是 MAC 地址没有显示的原因,-P\K 一起使用会阻止中间的所有内容显示,但不确定到底是什么放在\w+ 之后以显示 MAC 地址的其余部分。

【问题讨论】:

  • 试试grep -oP "MAC Address : \K\S+"
  • 非常感谢!明白了~
  • Wiktor Stribiżew 能否将其发布为答案,以便我将其标记为已回答?
  • 虽然stackoverflow.com/a/62840426/11329890 看起来像一个答案,但它的.* 可以比一个词走得更远,而MAC 地址就是一个词。这篇文章看起来很有用,对模式有更好的解释。

标签: regex linux grep pcre


【解决方案1】:

你可以搭配

grep -oP 'MAC Address : \K\S+' file

这里,

  • -o - 提取匹配的文本,而不是整行
  • P - 启用 PCRE 正则表达式语法
  • MAC Address : - 匹配文字文本
  • \K - 匹配重置运算符,将匹配的文本从内存匹配缓冲区中丢弃
  • \S+ - 一个或多个非空白字符。

【讨论】:

  • grep -P 是不可移植的。传统的解决方案是sed -n 's/.*MAC Address : //p'sed -n 's/.*MAC Address : \([0-9a-fA-F:]*\).*/\1/p',如果匹配后可能有不应打印的文本。
  • @tripleee 这一切都很好,只需注意答案是为了解决眼前的问题,而不是强迫 OP 更改使用的工具集。如果我习惯了特定的工具,我自己不需要任何替代方案。在这种情况下,我也会使用grep-P,因为我是普通的 Ubuntu Linux 用户和 NFA 正则表达式粉丝。如果 OP 对 sed 解决方案感兴趣,我会将其添加到答案中。
  • 当然,只是为未来的访客发表评论。也许这应该作为现有问题的副本关闭,希望答案的可移植性至少会被广泛记录。
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多