将 awk 命令的结果作为参数传递

Bla*_*ack 2 shell shell-script

假设我曾经awk获取过两个不同列的值:

说输出是:

美国广播公司

定义

现在,我想使用abcdef作为模式grep,使用带有上一个命令的管道。有没有办法做到这一点?

如需更多说明:

我有一个 pdf 文件,我正在使用该文件搜索关键字:

pdftotext 'filename.pdf' - | grep 'pattern'
Run Code Online (Sandbox Code Playgroud)

现在,如果找到任何匹配项,我想将结果的第一列和第二列用作管道中 grep 的参数,并使用上一个命令。我可以使用获得前两列

pdftotext 'filename.pdf' - | grep 'pattern' | awk '{ print $1, "\t"$2 }'
Run Code Online (Sandbox Code Playgroud)

现在我将如何在 grep 命令之后再次(第二次)将这两个值作为模式传递给管道中的上述一个?

Eri*_*ouf 5

您可以使用流程替换来做到这一点,如下所示:

grep -f <(awk '{print $1 "\n" $3}' filename) otherfile
Run Code Online (Sandbox Code Playgroud)

这将从grep文件(-f标志)中读取其模式,在这种情况下,它实际上是awk...filename每行打印一个模式的过程的输出。然后 grep 搜索这些模式otherfile

虽然如果你真的想在管道中做它可能效率较低,你可以通过grep从 stdin 读取它的模式来做到这一点

awk '{print $1 "\n" $3}' filename | grep -f - otherfile
Run Code Online (Sandbox Code Playgroud)

编辑:查看关于使用 grep 和 awk 的问题的编辑,您可以通过执行以下操作让 awk 为您进行模式匹配:

grep -Ff <(awk '/pattern/ {print $1 "\n" $3}' <(pdftotext 'filename.pdf' -)) otherfile
Run Code Online (Sandbox Code Playgroud)

或作为管道:

pdftotext 'filename.pdf' - | awk '/pattern/ {print $1 "\n" $3}' | grep -Ff - otherfile
Run Code Online (Sandbox Code Playgroud)