我是 grep 新手,我有一个包列表,我只需要显示某些结果。
以下是软件包列表:
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-dbg/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-doc/oldoldstable,oldoldstable 2.4.25-3+deb9u12 all
apache2-ssl-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-custom/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-pristine/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
我一直在尝试使用正则表达式,但我确信有问题:
cat list | grep 'apache2-(bin|data|utils)'
这是我的预期输出:
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
我的命令有什么问题/缺少什么?
答案1
使用 BRE(基本正则表达式)模式匹配时需要转义括号和|
字符,这是默认的grep
, 所以:
grep '^apache2-\?\(bin\|data\|utils\|\)/'
或者启用 ERE(扩展正则表达式)模式与-E
开关匹配:
grep -E '^apache2-?(bin|data|utils|)/'
笔记:
- 您不需要 feed
grep
with,cat
因为它像许多其他工具一样直接从文件中读取。 - 我添加了行首
^
以从行首开始匹配。 - 我
-?
在 ERE 和-\?
BRE 中添加了仅匹配连字符-
零次或一次的内容;另请注意,使用的\?
标准 BRE 无效(尽管它至少可以在 GNU 或其他一些工具中工作)。 BRE\?
相当于\{0,1\}
. - 我
|
在其中添加了一个空的最后一个匹配(...|...|...|)
,它将匹配诸如apache2
仅包含行之类的情况(但如果您的输入中有任何内容,它也会匹配,apache2-
如果您不想匹配它,请grep -E '^apache2(-(bin|data|utils)|)/'
改为使用); - 使用的
\|
也不是标准的 BRE,并且没有与之等效的东西。最好只使用 ERE 给出的替代方案。
答案2
尝试这个:
grep -Ex 'apache2(-(bin|data|utils))?' list
输出:
apache2
apache2-bin
apache2-data
apache2-utils
哎呀,问题改变了:)。
grep -E 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list
输出:
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
那么就不需要-x(完全匹配)了。
您可以使用egrep 代替-E 开关。
egrep 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list