我编写了一个单行程序,用于搜索文件夹,该文件是针对文件夹中某些文件的字符串列表。
我们的想法是创建一个新的输出,列出搜索到的字符串,然后是它找到的所有文件。
文件列表包含以下内容
alexl-lap:projects alexl$ cat list
abc-123
def-456
这是我到目前为止所做的:
alexl-lap:projects alexl$ for i in `cat list` ; do printf "\n$i:\n" ; grep -l --color=always $i * | /usr/bin/awk '{printf("%s\n", $0)}' ; done >> log.txt
alexl-lap:projects alexl$ cat log.txt
abc-123:
file1.txt
file2.txt
file3.txt
def-456:
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
如果我现在运行以下命令,这就是我得到的
alexl-lap:projects alexl$ /usr/bin/awk 'BEGIN{RS="";FS="\n"} {print $1 " " $2 "" $3 "" $4 "" $5 " "}' < log.txt
abc-123: file1.txt file2.txt file3.txt
def-456: file1.txt file2.txt file3.txt file4.txt file5.txt
这种使用手动指定字段显然是不好的做法。如果在15个文件中找到了被搜索的字符串,我需要包含1-15。
如何使用'nth'变量实现此目的?
我想要相同的输出,但是awk会查看找到该文件的文件数,并在搜索到的字符串之后打印所有这些文件(在一行中)。
由于
答案 0 :(得分:0)
此解决方案假定所有file*txt
文件名不包含特殊字符,也不包含:
。
试一试:
grep -Hf list *txt | awk 'BEGIN {FS=":"} {string=substr($0,length($1)+2); if (!filenames[string]) {filenames[string]=$1;} else {filenames[string]=sprintf("%s %s",filenames[string],$1);}} END {for (string in filenames) { print string ":" filenames[string]; }}'
def-456:file1.txt file2.txt file3.txt file4.txt file5.txt
abc-123:file1.txt file2.txt file3.txt