Bla*_*ack 2 shell shell-script
假设我曾经awk
获取过两个不同列的值:
说输出是:
美国广播公司
定义
现在,我想使用abc
和def
作为模式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 命令之后再次(第二次)将这两个值作为模式传递给管道中的上述一个?
您可以使用流程替换来做到这一点,如下所示:
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)