Grep 变灰生成输出

Grep 变灰生成输出,grep,makefile,Grep,Makefile,当尝试从make中筛选很长的输出以获取特定的警告或错误消息时,第一个想法如下: $ make | grep -i 'warning: someone set up us the bomb' 不过,结果并不完全令人满意。输出不仅包含来自grep的筛选结果,还包含来自make目标中使用的其他工具的stdout和stderr消息 现在的问题是: 其他输出来自哪里 如何编写过滤命令,使输出仅包含过滤后的行 排除标准: make 2>/dev/null | grep -i 'warning: so

当尝试从make中筛选很长的输出以获取特定的警告或错误消息时,第一个想法如下:

$ make | grep -i 'warning: someone set up us the bomb'
不过,结果并不完全令人满意。输出不仅包含来自
grep
的筛选结果,还包含来自
make
目标中使用的其他工具的
stdout
stderr
消息

现在的问题是:

  • 其他输出来自哪里
  • 如何编写过滤命令,使输出仅包含过滤后的行
  • 排除标准:

    make 2>/dev/null | grep -i 'warning: someone set up us the bomb'
    
    例子 然后grep
    make_output.log
    。如图所示

    例子
    回答以下问题:

  • 管道仅将
    make
    stdout
    连接到grep的
    stdin
    make
    stderr
    仍连接到中的终端,因此将在不过滤的情况下打印
  • 解决方案是将
    make
    stderr
    连接到其
    stdin
    并忽略
    stdin

    $ make 2>&1 >/dev/null | grep -i 'warning: someone set up us the bomb'
    

  • 这只打印grep的输出,但没有来自make或其他工具(如
    rm

    )的任何内容。我只是想查看编译器中的警告。使用make的沉默选项让我接近了我想要的地方

    从make手册页:

    -s, --silent, --quiet                                                                                                                       
    Silent operation; do not print the commands as they are executed.
    
    仍然有大量编译器警告我想忽略,所以我在调用make时设置了CFLAGS

    例如:

    make -s CFLAGS="-Wno-deprecated-declarations"
    
    如果您使用的是libtool,这也是非常有用的

    make LIBTOOLFLAGS='--silent' --quiet
    
    如果我只对一个特定的文件或一组文件感兴趣,我会使用touch命令,然后是无声make

    触摸foo.c;make-s CFLAGS=“-Wno不推荐的声明”


    最初,我尝试grep make输出,但是静默调用make、控制编译警告以及触摸文件以限制编译更为简洁。在所有这些之后,您仍然可以使用grep,但我会首先查看构建系统和编译器手册页。

    如果您执行
    make | tee myfile
    ,然后使用grep myfile呢?是的。我看到的是
    make
    输出被视为
    stderr
    。当
    grep
    接受stdin时,您的
    grep
    没有做任何事情。我认为
    tee
    解决方案可以工作,如果您将其设置为临时文件,然后将其删除<代码>生成| tee myfile;grep文本文件;rm myfile例如,您最好检查
    make
    手册页,查看是否有任何选项可以提供更好的输出。正如我之前所说,当前的
    make
    返回给你的stderr必须以不同的方式处理。@erikb85如果是你投了反对票,请考虑到试图帮助你的人投反对票并不是让他们感觉想再次这样做的最佳方式。如果是其他人,最好知道原因,因为我的答案没有错。之前我曾试图向你解释它实际上是错的,因为它不会导致预期的结果。预期结果是仅从grep获取输出。实际结果是根本没有输出。多亏我有了这个想法,这实际上帮助我找到了。你能重新措辞一下吗?我很难看出你的答案和问题之间的相关性。在我的例子中,我试图看到编译警告,它们在make执行时打印出来。了解谁打印了您感兴趣的警告以及实际的警告消息是什么是非常有用的。如果没有这些信息,最初的问题只是询问如何在shell中重定向输出,该shell包含在中,并且很可能是一个重复的问题。
    -s, --silent, --quiet                                                                                                                       
    Silent operation; do not print the commands as they are executed.
    
    make -s CFLAGS="-Wno-deprecated-declarations"
    
    make LIBTOOLFLAGS='--silent' --quiet