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

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

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

假设输出是:

ABC

定义

现在,我想将abcdef用作 的模式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$3from相匹配的行filename

答案3

这可以使用命令替换来完成。

引用自这里:

命令替换允许用命令的输出来替换命令名称本身。当命令包含如下时,将发生命令替换:

$(command)

或(反引号版本):

`command`

答案4

您可以学习如何使用xargs传递和定义参数。

cat filename|awk '{print $1,"\n"$3}'|xargs -I {} grep {} somefile

xargs -I {}将参数替换为“{}”以让 grep 使用它

相关内容