为什么grep命令中-e与-o参数的顺序会影响执行结果?
问题原因
这是Unix系命令行短选项的标准解析规则,以及grep选项自身的参数要求共同导致的:
grep的-o是无参标志选项,作用是仅输出匹配到的内容片段,不需要额外传值grep的-e是带参选项,必须紧跟匹配模式作为它的参数,作用是明确指定匹配模式,可用于声明多个模式或者避免模式以-开头时被识别为选项
两种写法的解析差异
- 对于
grep -oe 'n'
合并短选项-oe会被逐个解析:
- 先识别到
-o(无参,直接生效) - 再识别到
-e(带参,当前合并选项后已无剩余字符,所以取下一个命令行参数'n'作为-e的匹配模式)
最终解析结果等价于grep -o -e 'n',模式为n,从标准输入读取内容匹配,运行正常。
- 对于
grep -eo 'n'
合并短选项-eo解析时:
- 先识别到第一个字符对应
-e(带参,合并选项中e后面还有字符o,所以直接将o作为-e的匹配模式) - 原本位置的
'n'不再被识别为模式,而是被grep当成了要扫描的目标文件名
最终解析结果等价于grep -e 'o' 'n',系统找不到名为n的文件,因此抛出找不到文件的报错。
如果要避免这类问题,可以把带参数的选项单独写,不要和其他选项合并,比如明确写成grep -e 'n' -o就不会有顺序问题。
内容的提问来源于stack exchange,提问作者hinny
相关产品推荐
相关产品推荐

