2016-07-28 51 views
1
$ egrep "^COMP[29]041" enrolments | grep "|F$" | wc -l 
24 
$ egrep "^COMP[29]041" enrolments | egrep "|F$" | wc -l 
166 
$ 

文件enrolments的内容下半年egrep命令:为什么我得到不同的答案,当我改变的grep在每个

COMP2041|4836917|Ruld, Ruld      |3978/2|M 
COMP2041|4850109|Rvyiparzal, Ilbvuy    |3979/3|M 
COMP2041|2858836|Rzild, Fia Held     |3730/4|M 
COMP2041|4823158|Sheld, Yild      |3978/2|M 
COMP2041|4818044|Sheo, Sheo      |3978/2|M 
COMP2041|4818497|Sheo, Xa       |3978/2|M 
COMP9041|4899688|Shild, Ge      |8680/2|M 
COMP2041|4869506|Shild, Yild      |3645/2|M 
COMP9041|4897426|Shild, Yild      |8680/2|M 
COMP9041|4368551|Sho, Wuld      |8684 |M 
COMP2041|4339940|Shuld, Puaxail Baili    |3978/3|F 
COMP2041|4330093|Veh, Yeold-He     |3711/3|M 
COMP2041|2230267|Vikil, Ivrha      |3978/3|F 
COMP2041|4312663|Viy Chiobhova, Jiozrigh   |3978/1|M 
....... 

的问题是,为什么我得到不同的答案时,我改变了grepegrep在每个后半部分。 grepegrep有什么区别?

+0

这个问题的'有什么不同'部分相当于Unix SE问题;示例材料完全不在场外副本中。 –

回答

1

egrep(或,优选地,grep -E),则|是元字符,而在纯grep它是一个普通的(非甲基)字符。

|F$ term egrep在行末查找空字符串或F;它会在每一行找到一个空字符串。

grep中的相同术语在行尾寻找|F。要用egrep来寻找,你需要用反斜杠来代替元字符:grep -E '\|F$' enrolments

总之,普通的grep命令理解Basic Regular Expressions(BRE)。 egrep或'extended grep'命令理解Extended Regular Expressions(ERE)。 grep的某些版本(例如GNU grep)可以编译为识别Perl-Compatible Regular Expressions(PCRE)。

+0

为什么'grep -E'优先于'egrep'?是否因为'egrep'可以在将来被弃用?我可以看到使用统一二进制文件有一些优点,这与为什么人们使用busybox相同;但是还有其他原因吗?像代码标准化一样? – anishsane

+0

@anishsane:是的; “egrep”不再记录在POSIX中。理由(在我引用的同一页上)说:_这个'grep'已经以向上兼容的方式得到了增强,以提供历史'egrep'和'fgrep'命令的确切功能。标准开发人员的明确意图是将三个问题整合为一个命令。 旧的'egrep'和'fgrep'命令很可能会作为实现扩展支持多年,从而允许历史应用程序未经修改地运行。 –

相关问题