为什么 grep 和 regex 命令在 Ubuntu 上不起作用

为什么 grep 和 regex 命令在 Ubuntu 上不起作用

我想知道已安装的软件包以及以 mos 启动的软件包,然后下面的命令不起作用。

dpkg -l | grep  ^mos*

答案1

虽然^mos*是一个完美的 cromulent grep 基本正则表达式(BRE),但它可能并不意味着您所想的意思。您还应该养成引用传递给 grep 的任何模式的习惯,以便 shell 不会尝试将其扩展为当前目录中的文件名列表。1

*在正则表达式中量词而不是通配符,所以mos*意味着m o零个或多个s字符。shell 通配符的正则表达式等价*物是.*(任何字符,零次或多次)。但是,由于 grep 默认输出整行,即使匹配部分,因此尾随.*是多余的 -^mos效果与^mos.*

但是^将正则表达式锚定到线- 并dpkg -l在包名称之前输出包的状态,因此^mos在这种情况下永远不会匹配。

您可以使用^.. *mos来匹配两个锚定到行首的任意状态字符,后跟一个或多个空格mos

$ dpkg -l | grep '^..  *mos'
ii  most                                      5.0.0a-4                                       amd64        Pager program similar to more and less

不过我建议使用 awk 而不是 grep 来完成这项任务,因为你可以匹配特定的字段前任。

$ dpkg -l | awk '$2 ~ /^mos/'
ii  most                                      5.0.0a-4                                      amd64        Pager program similar to more and less

或者如果你想只输出匹配的已安装软件包

dpkg -l | awk '$1 == "ii" && $2 ~ /^mos/'

  1. 或者至少在需要时停止依赖 shell 将模式的字面值传递给 grep不是匹配 - 尽管 bash 默认这样做,但其他 shell(特别是 zsh)却不这样做。

答案2

要使用正则表达式,请按以下方式grep添加开关:-E

dpkg -l | grep -E '^mos.*'

但这不会给您任何结果,因为行以和其他字符dpkg -l开头。ii

您可以尝试这个:

apt list --installed | grep -E '^mos.*'

相关内容