【问题标题】:passing stdout to grep as pattern argument将标准输出作为模式参数传递给 grep
【发布时间】:2014-06-17 18:10:34
【问题描述】:

我很确定有人已经问过这个问题,但我找不到它,无论如何,这里是:

假设我们有一个文件:

$cat file
AAA 123
BBB 456
CCC 789

我想做一些类似的事情:

printf "BBB\nAAA\n" | grep - file

其中“-”是标准输出。但是 grep 不认为它是标准输出。

得到

BBB 456
AAA 123

它还应该适用于许多模式,而不是echo "BBB"。我没有 echo 我有几个管道和一个列表作为输出。

【问题讨论】:

    标签: bash grep pipe


    【解决方案1】:

    使用 gnu grep 你可以做到:

    printf "BBB\nAAA\n" | grep -f - file
    

    【讨论】:

    • 它对我不起作用:grep: -: No such file or directory(Mac 用户)
    • 我也是 Mac 用户,但使用 brew install grep 安装了 gnu grep。不幸的是,mac 上的默认 grep (BSD grep) 不支持 grep -f - 请参阅此 Q&A
    【解决方案2】:

    我终于找到了一个不能完全说服我的技巧:

    grep -f <(printf "BBB\nAAA\n") file
    

    返回:

    AAA 123
    BBB 456
    

    但是为什么会像file 的顺序一样呢?

    我觉得它不实用,因为它可能相当长而不是printf "BBB\nAAA\n"

    【讨论】:

    • 如果字符串很长,您应该将所有模式保存在一个文件中。
    • 没那么长(大约 20 吧?)。但是有没有办法将模式传递给 grep 而不是传递“文件”?
    • 是的,你可以这样做:egrep 'AAA|BBB' file
    • 不明白grep -f &lt;(printf "BBB\nAAA\n") file到底有什么问题你可以用任何长命令和管道替换printf
    • 是的,我知道,但我想知道是否有使用管道的解决方案。
    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2020-12-22
    • 2015-01-14
    相关资源
    最近更新 更多