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
你不需要grep用awk的,你不需要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目录中的每个文件中查找该数组中的每个键.
试试以下
awk '{print $1}' input.txt | xargs -n 1 -I pattern grep -rn pattern dir
Run Code Online (Sandbox Code Playgroud)