我想知道已安装的软件包以及以 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/'
- 或者至少在需要时停止依赖 shell 将模式的字面值传递给 grep不是匹配 - 尽管 bash 默认这样做,但其他 shell(特别是 zsh)却不这样做。
答案2
要使用正则表达式,请按以下方式grep
添加开关:-E
dpkg -l | grep -E '^mos.*'
但这不会给您任何结果,因为行以和其他字符dpkg -l
开头。ii
您可以尝试这个:
apt list --installed | grep -E '^mos.*'