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 -E
与 egrep
这些命令之间没有任何区别(在大多数操作系统上它们甚至由相同的可执行文件提供); 您的旧代码也容易受到此错误的影响,如果您没有看到它,那只是在 ps
获得足够的进程列表中“幸运”的问题在 shell 开始设置管道的 awk
部分之前阅读。
解决您的问题
正确的答案已经是,但可能的最小变化的答案是让你的awk
(假设它有 GNU 扩展并在字段分隔符规范中接受正则表达式)转义字符串 pmon
与您的第一个 grep 命令相同:
ps -ef|grep '[p]mon'|awk -F'ora_[p]mon_' '{print $NF}'|grep -Ev 'ASM|^$'
我读到 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 -E
与 egrep
这些命令之间没有任何区别(在大多数操作系统上它们甚至由相同的可执行文件提供); 您的旧代码也容易受到此错误的影响,如果您没有看到它,那只是在 ps
获得足够的进程列表中“幸运”的问题在 shell 开始设置管道的 awk
部分之前阅读。
解决您的问题
正确的答案已经是awk
(假设它有 GNU 扩展并在字段分隔符规范中接受正则表达式)转义字符串 pmon
与您的第一个 grep 命令相同:
ps -ef|grep '[p]mon'|awk -F'ora_[p]mon_' '{print $NF}'|grep -Ev 'ASM|^$'