从shell中的输出中选择两行中的不同值

时间:2014-04-24 08:39:21

标签: shell grep tr

我正在使用runmqsc命令获取如下输出。但我想要删除一些。我正在使用egrep和cut但没有得到所需的结果。

Runmqsc命令:echo“dis clusqmgr(*)suspend”| runmqsc QMGR1

原始输出:

1 : dis clusqmgr(*) suspend
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(GWD1)                       CHANNEL(TO.GWD1.SSL)
CLUSTER(CLUSD)                        SUSPEND(NO)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(GWD2)                       CHANNEL(TO.GWD2.SSL)
CLUSTER(CLUSD)                        SUSPEND(NO)

期望的输出:

CLUSQMGR(GWD1) SUSPEND(NO)
CLUSQMGR(GWD2) SUSPEND(NO)

我用来实现这个目的:

echo "dis clusqmgr(*) suspend"|runmqsc QMGR1|egrep 'CLUSQMGR|SUSPEND'| tr ')' '\n' | grep "CLUSQMGR(" | cut -f 2  -d ")"

请帮忙。

2 个答案:

答案 0 :(得分:1)

将输出传输到的一种方法:

egrep 'CLUSQMGR|SUSPEND' | paste - - | awk '{print $1, $4}'

例如,

egrep 'CLUSQMGR|SUSPEND' filename | paste - - | awk '{print $1, $4}'

其中filename包含您发布的原始输入

CLUSQMGR(GWD1) SUSPEND(NO)
CLUSQMGR(GWD2) SUSPEND(NO)

另一种方法是将命令输出传递给:

egrep -o '\b(CLUSQMGR|SUSPEND)\S+' | paste - -

答案 1 :(得分:0)

边界参数是什么?我假设任何带冒号的行都应该被忽略,并且任何CLUSQMGR行的第一个条目和任何SUSPEND行的最后一个条目都应该合并并打印。以下内容仅在两者都出现时才能正常工作,并且始终按此顺序排列:

runmqsc QMGR1 <<<'dis clusqmgr(*) suspend' |
awk '/:/ { g=""; next }
    /CLUSQMGR/ { g=$1; next }
    /SUSPEND/ { print g, $NF; g="" }'

这显然是临时的;一个正确的解决方案将涉及runmqsc输出的真实解析器(谷歌搜索显示多次尝试,但我无法判断它们的质量)或runmqsc版本打印正确的机器可读输出(例如JSON)。 / p>