bash - 在终端中执行命令后如何 grep 查找特定文本?

标签 bash terminal grep amazon-elastic-beanstalk

我正在执行

eb deploy my_env,

之后,命令行中显示了相当多的文本,我想 grep 表示 “更新成功完成” 完成后 上述命令,如果未找到,则返回退出状态 1。

我想知道这怎么可能。

(如果您对原因感兴趣,我发现尽管部署失败,但 eb 部署仍返回退出状态 0)

最佳答案

这是管道用途的教科书案例:

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 ,可在 bash 中找到。 , kshzsh :

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

tee 会将输出复制到文件和 stdoutstdout将通过管道传输到 grep像之前一样。我们不指定文件,而是使用子进程 >(<a href="http://linuxcommand.org/man_pages/cat1.html" rel="noreferrer noopener nofollow">cat</a>) ,它只会将输出打印到命令行。

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

关于bash - 在终端中执行命令后如何 grep 查找特定文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44161728/

相关文章:

bash - 剪切/格式化docker服务命令

regex - 如何使用 R 或命令行提取与文本文件中的电子邮件地址匹配的表达式?

linux - 删除 wget 输出中的重复行

javascript - Node.js/Grunt - 无法运行 Grunt 的 watch - 为什么?

java - 找出特定包的类在 Java/Eclipse 项目中的使用位置

linux - 如何在shell脚本中扩展变量?

macos - ZSH 'Sticky' 提示符

bash - 将 sed 与 ${parameter} 一起使用

python - bash 在继续之前等待第一个 python 文件启动

macos - 用于在所有文件中搜索文本字符串的 Unix 命令