假设我曾经awk
获取两个不同列的值:
假设输出是:
ABC
定义
现在,我想将abc
和def
用作 的模式grep
,将管道与上一个命令一起使用。有什么办法可以做到这一点吗?
如需更多说明:
我有一个 pdf 文件,我正在使用以下命令搜索该文件的关键字:
pdftotext 'filename.pdf' - | grep 'pattern'
现在,如果找到任何匹配项,我想使用结果的第一列和第二列作为管道中 grep 与上一个命令的参数。我可以使用前两列
pdftotext 'filename.pdf' - | grep 'pattern' | awk '{ print $1, "\t"$2 }'
现在,我将如何在管道中的 grep 命令之后再次(第二次)将这两个值作为模式传递到上面的值?
答案1
您可以通过流程替换来做到这一点,如下所示:
grep -f <(awk '{print $1 "\n" $3}' filename) otherfile
这将从grep
文件(标志)中读取其模式,在本例中,该文件实际上是每行打印一个模式的-f
进程的输出。awk...filename
然后 grep 搜索这些模式otherfile
grep
尽管效率可能较低,但如果您确实想在管道中执行此操作,则可以通过从标准输入读取其模式来实现,例如
awk '{print $1 "\n" $3}' filename | grep -f - otherfile
编辑:看到您的问题关于使用 grep 然后 awk 的编辑,您可以让 awk 通过执行以下操作来为您进行模式匹配:
grep -Ff <(awk '/pattern/ {print $1 "\n" $3}' <(pdftotext 'filename.pdf' -)) otherfile
或作为管道:
pdftotext 'filename.pdf' - | awk '/pattern/ {print $1 "\n" $3}' | grep -Ff - otherfile
答案2
许多 shell 支持命令替换例如
p=$(awk '{ print $1,$3 }' filename)
将命令的输出捕获awk '{ print $1,$3 }' filename
到变量中p
。请注意,您的cat
此处是多余的:awk
可以直接从filename
.
但是,我怀疑你真正想做的是处理连续的输出行awk
并将它们解析为分离变量。如果是这种情况,您可能可以执行以下操作
awk '{print $1,$3}' filename | while read -r p1 p2; do grep -F "$p1" otherfile | grep -F "$p2"; done
查找与otherfile
两个字段$1
和$3
from相匹配的行filename
。
答案3
答案4
您可以学习如何使用xargs
传递和定义参数。
cat filename|awk '{print $1,"\n"$3}'|xargs -I {} grep {} somefile
xargs -I {}
将参数替换为“{}”以让 grep 使用它