如何在awk中运行grep?

e27*_*314 8 linux bash awk grep

假设我有一个input.txt包含少量列和几行的文件,第一列是键,一个dir文件包含其中一些键的目录.我想找到dir包含这些关键词的文件中的所有行.起初我试图运行命令

cat input.txt | awk '{print $1}' | xargs grep dir
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它认为密钥是我的文件系统上的路径.接下来我尝试了类似的东西

cat input.txt | awk '{system("grep -rn dir $1")}'
Run Code Online (Sandbox Code Playgroud)

但这也没有用,最终我不得不承认即使这样也行不通

cat input.txt | awk '{system("echo $1")}'
Run Code Online (Sandbox Code Playgroud)

在我试图\逃离白色空间和$标志后,我来到这里征求您的意见,任何想法?

当然我可以做点什么

for x in `cat input.txt` ; do grep -rn $x dir ; done
Run Code Online (Sandbox Code Playgroud)

这还不够好,因为它需要两个命令,但我只想要一个.这也说明了为什么xargs不起作用,参数不是最后一个参数

Ed *_*ton 27

你不需要grepawk的,你不需要cat打开文件:

awk 'NR==FNR{keys[$1]; next} {for (key in keys) if ($0 ~ key) {print FILENAME, $0; next} }' input.txt dir/*
Run Code Online (Sandbox Code Playgroud)

你也不需要xargs,shell循环或其他任何东西 - 只需要一个简单的awk命令就可以完成所有操作.

如果input.txt不是文件,那么将上面的内容调整为:

real_input_generating_command |
awk 'NR==FNR{keys[$1]; next} {for (key in keys) if ($0 ~ key) {print FILENAME, $0; next} }' - dir/*
Run Code Online (Sandbox Code Playgroud)

它所做的只是从第一个文件(或输入流)创建一个键数组,然后在dir目录中的每个文件中查找该数组中的每个键.

  • **+ 1**......这比我们其他人想出来的要干净得多. (2认同)
  • @jkshah - 没有后来的grep递归是一个可怕的想法和GNU家伙谁介绍它应该采取自己的键盘远,因为他们一定是忘记了UNIX的咒语,每一个工具,应该做的一两件事,把它做好.有一个非常好的工具来查找文件,它有一个非常明显的名称.如果需要递归搜索来查找文件,那么这就是应该用它来执行它的工具,而不是grep,其名称也是从它的目的派生的 - 全局搜索文件中的正则表达式并打印匹配. (2认同)

jks*_*hah 6

试试以下

awk '{print $1}' input.txt | xargs -n 1 -I pattern grep -rn pattern dir
Run Code Online (Sandbox Code Playgroud)

  • 确实如此,当我看到“模式”时,我想我正在查看示例代码,而 `%` 显然是别的东西。正如jkshah所说,个人选择。 (2认同)