Bash awk使用{print$x}在输出中打印一个额外的行

Bash awk使用{print$x}在输出中打印一个额外的行,bash,awk,Bash,Awk,我在答案中搜索,但没有成功。。。在RHEL Linux上,第一个命令列出了我为那些想要测试的人提供的确切信息…: ps -eaf | grep lsnr | grep -v ' LISTENER ' | grep -v grep oracle 10258 1 0 2014 ? 01:34:43 /logicielPR1/oracle/product/11.2.0.4/bin/tnslsnr PRXPLO -inherit oracle 10442 1

我在答案中搜索,但没有成功。。。在RHEL Linux上,第一个命令列出了我为那些想要测试的人提供的确切信息…:

ps -eaf | grep lsnr | grep -v ' LISTENER ' | grep -v grep
oracle   10258     1  0  2014 ?        01:34:43 /logicielPR1/oracle/product/11.2.0.4/bin/tnslsnr PRXPLO -inherit
oracle   10442     1  0  2014 ?        00:24:30 /logicielTE1/oracle/product/11.2.0.4/bin/tnslsnr TECHIMIO -inherit
oracle   10473     1  0  2014 ?        00:28:50 /logicielTE1/oracle/product/11.2.0.4/bin/tnslsnr TEIAC -inherit
oracle   10566     1  0  2014 ?        00:24:50 /logicielTE1/oracle/product/11.2.0.4/bin/tnslsnr TEIMG -inherit
oracle   14192     1  0  2014 ?        00:22:09 /logicielPR1/oracle/product/11.2.0.4/bin/tnslsnr PROCTM2 -inherit
oracle   27167     1  0  2014 ?        00:19:26 /logicielTE1/oracle/product/11.2.0.4/bin/tnslsnr TEOCTM -inherit
oracle   36854     1  0  2014 ?        00:19:59 /logicielTE1/oracle/product/11.2.0.4/bin/tnslsnr TEANA -inherit
oracle   37235     1  0 May20 ?        00:08:32 /logicielPR1/oracle/product/11.2.0.4/bin/tnslsnr PRCHIMIO -inherit
oracle   45141     1  0 Jun03 ?        00:08:02 /logicielST1/oracle/product/11.2.0.4/bin/tnslsnr PRIACS -inherit
oracle   48241     1  0 Sep25 ?        00:04:39 /logicielPR1/oracle/product/11.2.0.4/bin/tnslsnr PRINL -inherit
oracle   48708     1  0 Sep25 ?        00:03:27 /logicielTE1/oracle/product/11.2.0.4/bin/tnslsnr TEINL2 -inherit
我想在第一行提取大写名称,例如:PRXPLO,因此我:

ps -eaf | grep lsnr | grep -v ' LISTENER ' | grep -v grep | awk -F "${ORA_LISTENER_HEADER}|${ORA_LISTENER_HEADER_UPPER}|tnslsnr " '{print $2}'
PRXPLO -inherit
TECHIMIO -inherit
TEIAC -inherit
TEIMG -inherit
PROCTM2 -inherit
TEOCTM -inherit
TEANA -inherit
PRCHIMIO -inherit
PRIACS -inherit
 {print $2}
PRINL -inherit
TEINL2 -inherit
*注意:在这个命令中,${ORA_LISTENER_HEADER}|${ORA_LISTENER_HEADER_UPPER}| tnslsnr将等同于tnslsnr

显然,包含{print$2}的行不应该存在,但我找不到它的来源。 我知道我可以通过grep简单地排除它,但我更愿意理解我做错了什么

有人能帮我解决这个问题吗


谢谢大家。

是的,您必须通过grep排除它。awk是一个单独的进程,它显示在通过运行整个链进行grep的进程列表中

ps -eaf | grep lsnr | grep -v ' LISTENER ' | grep -v grep | grep -v awk | awk -F "${ORA_LISTENER_HEADER}|${ORA_LISTENER_HEADER_UPPER}|tnslsnr " '{print $2}'

为了缓解问题,只需使用一个awk电话:

ps -eaf | awk '/lsnr/ && !/ LISTENER / {print $(NF-1)}'

但在同一个脚本中,这一行:ps-eaf | grep pmon | grep-v grep | awk-F{print$3}没有这个问题。。。为什么?很抱歉,我不是脚本专家…awk命令包含您正在搜索的单词lsnr。因此,包含awk命令的ps行将包含在awk命令的输入中,这是我的误解。有趣的是,我的同事们都没想过。ps-cargs=$pgrep tnslsnr | awk'$2!=监听器{print$2}'?非常聪明。。。非常感谢。