bash脚本:执行命令并将其输出传递给awk

时间:2012-10-17 13:35:52

标签: bash awk cluster-computing

我遇到了bash脚本的问题。基本上,在我的脚本中我运行命令

bjobs -u $1

$ 1是脚本参数,它是我的集群上用户的id。如果用户$ 1在群集上没有正在运行/挂起的作业,则bjobs打印

 No unfinished jobs found

到stdout。此外,退出状态为255.如果用户$ 1确实有作业,bjobs打印:

JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
45823   .......
45824   .......
.
.

并退出状态为0.我希望awk解析bjobs的输出。我试过了

bjobs -u $1 | awk '...'

其中'...'是我的awk解析程序。这不能很好地工作,因为显然当用户$ 1没有正在运行/挂起的作业时,字符串“找不到未完成的作业” 传递给awk。

也是如此
bjobs -u $1 > foo
awk '...' foo 

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

也许这条消息(我猜是一种错误)来到STDERR而不是STDOUT。

您可以使用>重定向bas​​h中的IO流文件描述符,2是STDERR。

尝试:

bjobs -u $1 2>&1 | awk '...'

看看能否解决这个问题。 2>& 1部分意味着将STDERR(2)重定向到STDOUT(1),STDOUT是通过管道传输到awk的内容。

更多信息:http://www.tldp.org/LDP/abs/html/io-redirection.html

答案 1 :(得分:1)

bjob​​s可能会向stderr打印“找不到未完成的工作”。

将2>& 1添加到管道stderr到stdout。

More info on bash IO redirection