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

Del*_*aIV 1 bash awk cluster-computing

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

bjobs -u $1
Run Code Online (Sandbox Code Playgroud)

$ 1是脚本参数,它是集群中用户的ID。如果用户$ 1在群集上没有正在运行/待处理的作业,则打印bjobs

 No unfinished jobs found
Run Code Online (Sandbox Code Playgroud)

到标准输出。另外,退出状态为255。如果用户$ 1确实有工作,则bjobs将输出:

JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
45823   .......
45824   .......
.
.
Run Code Online (Sandbox Code Playgroud)

并且退出状态为0。我想awk解析bjobs的输出。我试过了

bjobs -u $1 | awk '...'
Run Code Online (Sandbox Code Playgroud)

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

bjobs -u $1 > foo
awk '...' foo 
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

syn*_*ync 5

也许该消息(我想是一种错误)不是STDOUT而是STDERR。

您可以使用>将bash中的IO流重定向到文件描述符,并且2是STDERR。

尝试:

bjobs -u $1 2>&1 | awk '...'
Run Code Online (Sandbox Code Playgroud)

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

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