我目前正在学习更多关于在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 似乎运行良好。我不确定为什么会这样?
答案 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
。
但是你想要做什么?这是您的命令行尝试执行的操作:
你与
越来越近了match1\nmatch2...
因为运行grep假设cut有效完成。或者你可以使用
cut ... && grep ...
将结果放在命令行上。你需要搞乱引用,但是你仍然会寻找一条包含你所有匹配字段的行。
我推荐你的意思是这样的:
grep -f `cut ...`