2013-10-29 54 views
2

當我做下面的grep我得到的結果我無法對自己解釋:奇怪的行爲

host:/usr/local/tomcat > grep '-XX:PermSize=256m' * 
RELEASE-NOTES:  http://www.apache.org/licenses/LICENSE-2.0 
RUNNING.txt:  http://www.apache.org/licenses/LICENSE-2.0 

據我所知,沒有在我的正則表達式的字符有特殊含義(方括號內,-有一個,但沒有)。我也把它放在單引號中,所以它不應該被shell修改。

  • grep的版本:grep的(GNU的grep)2.5.1
  • 的Tomcat版本:6.0.36(二進制 發行版)

回答

4

因爲你的模式有減號-開始,grep把它解釋作爲論據。

你可以說:

grep -- '-XX:PermSize=256m' * 

--會告訴grep停止處理命令行參數。

或者,你可以說:

grep -- '[-]XX:PermSize=256m' * 

(當你說[-]連字符被解釋爲一個文本既然你說(inside square brackets, - has one..,似乎應澄清。)

2

我的grep抱怨

grep: invalid matcher X:PermSize=256m 

但你可以在這裏看到的是grep認爲-X...作爲一個選項。爲了使它停止解釋選項,使用--,即

grep -- -XX:PermSize=256m * 

單引號是沒有必要的。

3

外殼擴展命令如下:

grep -XX:PermSize=256m LICENSE NOTICE RELEASE-NOTES RUNNING.txt bin conf lib … 

grep的接受祕密參數-Xoptarg而不報告的無效選項In the source code它讀取

/* -X is undocumented on purpose. */ 

然而,下一個標記,LICENSE被取爲正則表達式。鍵入grep -X *將LICENSE令牌作爲參數-X的輸入字符串,並在RELEASE-NOTES和RUNNING.txt中注意注意

祕密grep資本X參數的含義是設置內部模式,即

  • grep -X grep→表現正常(grep -G
  • grep -X egrep→表現得像grep -E
  • grep -X awk→使用RE_SYNTAX_AWK
  • grep -X fgrep→表現得像grep -F
  • grep -X perl→表現得像grep -P
  • grep -X 'unrecognized string'表現正常
+0

1爲鏈接到[源(http://git.savannah.gnu.org/cgit/grep.git/tree/src/main.c#n1550)。 – devnull