egrep 给了我我想要的, grep -E 没有

egrep gives me what I want, grep -E does not

我读到 egrep 已被弃用,而 grep -E 所以我回顾了我的代码并在我找到它的地方进行了更改。 但是我看到结果并不总是像预期的那样。

使用 egrep,我得到了 运行 个 Oracle 实例的列表:

ps -ef|grep [p]mon|awk -F'ora_pmon_' '{print $NF}'|egrep -v 'ASM|^$'
halana
bila
halsasa
loana

但是使用 grep -E,我在结果中得到了部分 awk:

ps -ef|grep [p]mon|awk -F'ora_pmon_' '{print $NF}'|grep -Ev 'ASM|^$'
halana
bila
halsasa
 {print $NF}
loana

排除 'print' 显然可行,但这样做是否正确?:

ps -ef|grep [p]mon|awk -F'ora_pmon_' '{print $NF}'|grep -Ev 'ASM\|^$|print'
halana
bila
halsasa
loana

这种效果是因为 grep -E 允许额外的正则表达式语法吗?

建议简化您的行,删除所有 grep 命令:

pgrep -af 'pmon'|awk -F'ora_pmon_' '!/ASM|^$/{print $NF}'

将第一个 grep 命令折叠成 pgrep 命令。

将第二个 grep 命令折叠到 awk scirpt !/ASM|^$/{print $NF}

关于 grep -Eegrep

这些命令之间没有任何区别(在大多数操作系统上它们甚至由相同的可执行文件提供); 您的旧代码也容易受到此错误的影响,如果您没有看到它,那只是在 ps 获得足够的进程列表中“幸运”的问题在 shell 开始设置管道的 awk 部分之前阅读。

解决您的问题

正确的答案已经是,但可能的最小变化的答案是让你的awk(假设它有 GNU 扩展并在字段分隔符规范中接受正则表达式)转义字符串 pmon 与您的第一个 grep 命令相同:

ps -ef|grep '[p]mon'|awk -F'ora_[p]mon_' '{print $NF}'|grep -Ev 'ASM|^$'