【问题标题】:What is the proper method to pipe the output of the cut command into a grep command?将 cut 命令的输出通过管道传输到 grep 命令的正确方法是什么?
【发布时间】:2015-04-18 12:49:11
【问题描述】:

我目前正在学习更多关于在 OSX 终端上使用 Bash shell 的知识。我正在尝试将 cut 命令的输出通过管道传输到 grep 命令中,但是即使我知道有匹配项, grep 命令也没有给出任何输出。我正在使用以下命令:

cut -d'|' -f2 <filename.txt> > <temp.txt> | grep -Ff <temp.txt> <searchfile.txt> > <filematches.txt>

我认为这应该可行,但我看到的大多数示例通常将 grep 输出通过管道传输到 cut。我的目标是从文件中剪切字段 2 并将其用作在 .但是,使用该命令没有产生任何输出。

当我首先使用 cut 命令生成 temp.txt,然后在没有管道的情况下手动运行 grep 时,grep似乎运行良好。我不确定这是为什么?

【问题讨论】:

    标签: bash terminal grep cut


    【解决方案1】:

    你可以在这里使用process substitution

    grep -Ff <(cut -d'|' -f2 filename.txt) searchfile.txt > filematches.txt
    

    &lt;(cut -d'|' -f2 filename.txt) 正在将 cut 命令的输出作为文件提供给 grep

    【讨论】:

    • 我喜欢那个解决方案,因为它是一个简单的单行。在我的示例中, 有 20,000 条记录,而 有大约 250 万条记录。我在这里阅读了很多线程,试图在处理这样的较大文件时找到优化 grep 的不同方法。我今天运行了大约 4 个小时,但还没有完成。我使用了之前线程中提到的 LC_ALL=c, LANG=C 选项。有没有什么优化方法可以提高 grep 处理大文件的速度?
    • 如果您显示两个文件的一些示例数据,那么我可能会想出一些方法来加快速度。
    【解决方案2】:

    好吧,一个原因这条线的行为不像你预期的那样

    cut -d'|' -f2 <filename.txt> > <temp.txt> | grep -Ff <temp.txt> <searchfile.txt> > <filematches.txt>
    

    你的剪辑输出是temp.txt。您没有向管道发送任何内容。现在,方便地管道也开始了一个新的推荐,所以它并不重要——grep 运行并读取searchfile.txt

    但是你想做什么?这是您的命令行尝试执行的操作:

    1. 从 filename.txt 中获取第二个以竖线分隔的字段
    2. 将其写入文件
    3. 运行 grep ...
    4. ... 使用 2 中的文件内容作为 grep 搜索字符串(这也不会按照您的想法执行,因为您实际上是在要求 grep 查找模式 match1\nmatch2...)李>

    你会更亲近

    cut ... && grep ...
    

    运行 grep 假设 cut 有效完成。或者你可以使用

    grep -f `cut ...` 
    

    这会将结果放在命令行上。您需要搞乱引用,但您仍将寻找包含 cut 中所有匹配字段的行。

    我建议你的意思是这样的:

    for match in `cut ...`
    do
        grep -f $match >> filematches.txt
    done
    

    【讨论】:

    • 感谢您提供的信息。我没想过在那里使用 && 选项。这些选项中的任何一个是否会比另一个具有更好的性能?我正在使用的 文件中有大约 250 万条记录,而模式文件 中有大约 20k 行。
    • 稍微玩一下,我认为 && 版本可能是最接近的,只要您确信 grep 使用 -F 可以为您提供所需的结果。但是我还没有尝试过 20K 行,这将是一个 greps FSA 编译器的有趣测试。
    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2019-08-17
    • 2021-03-29
    • 2018-11-17
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多