将cut命令的输出传递给grep命令的正确方法是什么?

时间:2015-02-17 18:01:58

标签: bash terminal grep cut

我目前正在学习更多关于在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 似乎运行良好。我不确定为什么会这样?

2 个答案:

答案 0 :(得分:4)

您可以在此处使用process substitution

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

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

答案 1 :(得分:0)

好的,原因这一行并不像你期望的那样行事

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. 将其写入文件
  4. 运行grep ...
  5. ...使用2中文件的内容作为grep搜索字符串(也不会按照你的想法去做,因为你有效地要求grep查找模式{{ 1}})
  6. 你与

    越来越近了
    match1\nmatch2...

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

    cut ... && grep ...
    

    将结果放在命令行上。你需要搞乱引用,但是你仍然会寻找一条包含你所有匹配字段的行。

    我推荐你的意思是这样的:

    grep -f `cut ...`