grep命令的奇怪行为

时间:2013-10-29 07:21:19

标签: grep

当我做以下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

Afaik,我的正则表达式中没有一个字符具有特殊含义(在方括号内,-有一个,但没有)。我也把它放在单引号中,所以shell不应该修改它。

  • Grep版本:grep(GNU grep)2.5.1
  • Tomcat版本:6.0.36(二进制版 发行)

3 个答案:

答案 0 :(得分:4)

由于您的模式以减号-开头,grep会将其解释为参数。

你可以说:

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

--会告诉grep停止处理命令行参数。

或者,您可以说:

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

(当你说[-]连字符被解释为文字。因为你说(inside square brackets, - has one..,似乎应该澄清它。)

答案 1 :(得分:3)

shell将命令扩展为以下内容:

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中输入 NOTICE

秘密grep capital 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'→正常行事

答案 2 :(得分:2)

我的grep抱怨

grep: invalid matcher X:PermSize=256m

但您在此处可以看到grep认为-X...是一个选项。要使其停止解释选项,请使用--,即

grep -- -XX:PermSize=256m *

单引号不是必需的。