grep隐藏命令输出

时间:2017-08-29 17:50:26

标签: bash grep

我有一个命令:

bin/deploy staging --profile my_profile | grep 'UploadError'

通常

bin/deploy staging --profile my_profile  

将许多日志行打印到控制台,但是在执行grep时,所有内容都会被静音。有没有我可以用来取消日志输出的标志?

基本上打印出命令通常打印到控制台的内容,并执行grep。

grep的目的是我有一些逻辑来处理部署期间的UploadError。我想打印完整输出的原因是我想看看部署期间发生了什么,而不是抑制日志。

目前如果grep找不到字符串,则不会打印任何内容。如果它确实打印了以下内容:

[web] UploadError

[worker] UploadError

如果我删除grep命令,则会将以下内容打印到控制台:

[web] INFO: Uploading archive to s3 location: my-app/app-27b50-
170829_133831-stage-170829_133831.zip
[web] INFO: Creating AppVersion app-27b50-170829_133831-stage-
170829_133831
[web] WARNING: Deploying a previously deployed commit.
[web] Uploading my-app/app-27b50-170829_133831-stage-
170829_133831.zip to S3. This may take a while.
[web] Upload Complete.

所以我要做的就是做grep,无论是否找到字符串,还要将原始命令的输出打印到控制台。

2 个答案:

答案 0 :(得分:3)

  

/dev/tty

     

与该流程的流程组相关联,如果有的话。它是   对于希望确定的程序或shell程序很有用   无论如何,向终端写入消息或从终端读取数据   输出已重定向。它也可以用于那些应用程序   当需要输入输出时,需要输出文件的名称   找出目前正在使用的终端是很烦人的。每个   进程,控制终端的同义词

例如

akshay@db-3325:/tmp$ cal | tee /dev/tty | grep -i august
    August 2017       
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31        

    August 2017 

保存在变量中

akshay@db-3325:/tmp$ myvar=$(cal | tee /dev/tty | grep -i august)
    August 2017       
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31        

akshay@db-3325:/tmp$ echo $myvar
August 2017

您可以进一步检查变量,如下所示

akshay@db-3325:/tmp$ myvar=$(cal | tee /dev/tty | grep -i september)
    August 2017       
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31        

akshay@db-3325:/tmp$ [ -z "$myvar" ] && echo "Not found" || echo "Found september"
Not found

答案 1 :(得分:1)

  

基本上打印出命令通常打印到控制台的内容,并执行grep。

我不相信grep可以做到这一点,但greplike工具ack出于这个原因有--passthru选项。它将从输入中输出所有行,并突出显示它找到的匹配项。