2017-05-24 51 views
0

我执行此后相当文本的位在命令行中显示如何在终端执行一个命令后grep一个特定的文本?

eb deploy my_env, 

,我想grep"update completed successfully"若以上命令完成,如果没有发现返回退出状态为1.

我在想这怎么可能。

(如果你有兴趣,为什么,我发现EB部署尽管部署失败返回0退出状态)

+2

'eb deploy my_env | grep“更新成功完成”? –

+0

谢谢@MadPhysicist,管道的数量是否有限制?实际的命令有点涉及: eb deploy my_env | sed等等等等等等,我可以这样做: eb deploy my_env | sed等等等等等等grep“更新成功完成”? – HosseinK

+0

@HseseinK。当然。这正是你如何使用管道。我会更新我的答案。 –

回答

3

这就是一个范例什么管用于:

eb deploy my_env | grep "update completed successfully" 

如果要抑制grep输出,使用-q标志。其结果将充当就像eb deploy有实际符合您需求的错误代码:

eb deploy my_env | grep -q "update completed successfully" 

正如你在你的意见提了,eb deploy my_env实际上可以命令任何其他管道包含"update completed successfully"某处最终输出。整个管道的返回值将为最后一条命令的返回值grep

这种类型的管道实际上是UNIX设计的基本原则。 UNIX命令是理想的小块,可以执行单个功能并且很好地执行。这个想法是,将一些强大的模块连接在一起比编写一个完成一切的非常复杂的程序要容易得多。

有趣的更新

实际上,你可以看到从eb deploy的原始输出并仍然使用grep来确定返回代码。 (这更好地表明链接的管道),最简单的方法是使用process substitution,这是bashkshzsh可供选择:

eb deploy my_env | tee >(cat) | grep -q "update completed successfully" 

tee将输出复制到文件和stdout。如前所述,stdout将被传送至grep。我们不用指定文件,而是使用子进程>(cat),它只会将输出打印到命令行。

对于其他更便携的方法,请参阅有关Unix/Linux堆栈交换的this post以获取更多信息。

+0

'grep -q'将在第一次匹配时停止,并且可能不允许该命令运行到完成 –

+0

@thatotherguy。 OP只是想转换返回码,所以这很好。 –

+0

OP指定“完成上述命令后”,强调他们的 –

-1

管道输出到一个文件中。然后grep那个输出。

eb deploy my_env > deploy_results.txt 
grep 'update completed successfully' deploy_results.txt 
+0

这可以说是效率最低的方法...... –

+0

OP显然是一个初学者。我更关心的是将保存到文件的概念和精益求精的效率。 –

+0

你为什么介绍保存到文件? –

0

grep返回退出代码。只使用退出代码而不输出匹配,使用以下命令:

if <command> | grep -q "<text>"; then ... 

-q是安静模式。

相关问题