2016-07-28 52 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'命令很可能會作爲實現擴展支持多年,從而允許歷史應用程序未經修改地運行。 –

相關問題