shell脚本,用于在多个文件中查找多个字符串,然后像;字符串-文件名“;
我想写一个shell脚本,它从文件中获取输入,并在目录中的多个文件中搜索该字符串。我已经成功地编写了一个脚本,它显示文件名包含匹配的字符串。但是我也想打印输入字符串的名称 input.txt-shell脚本,用于在多个文件中查找多个字符串,然后像;字符串-文件名“;,shell,solaris,Shell,Solaris,我想写一个shell脚本,它从文件中获取输入,并在目录中的多个文件中搜索该字符串。我已经成功地编写了一个脚本,它显示文件名包含匹配的字符串。但是我也想打印输入字符串的名称 input.txt- name1 name2 name3 name4 目录-/a/b/ 输出- name1 : file1, file2 name2 : file1 name3 : no results found name4 : file4 许多在Linux上被视为理所当然的便利设施在Solaris上是不可用的(至少So
name1
name2
name3
name4
目录-/a/b/
输出-
name1 : file1, file2
name2 : file1
name3 : no results found
name4 : file4
许多在Linux上被视为理所当然的便利设施在Solaris上是不可用的(至少Solaris 10及更高版本)。例如,
grep
命令不采用-r
选项,find
不支持+
而不是代码>。这使生活更加烦躁
我将假设您的文件名(以及搜索到的名称)不包含空格或换行符(或其他导致问题的字符)。我还将假设您使用ksh
或bash
而不是/bin/sh
,因此使用$(…)
而不必使用反勾号是可行的
您的要求包括三个部分:
阅读要搜索的姓名列表
查找包含这些名称的文件
格式化查找文件的结果
这可以通过以下方式解决:
base="/a/b"
while read name
do
list=$(find "$base" -type f -print | xargs grep -l "$name")
if [ -z "$list" ]
then echo "$name : no results found"
else { echo "$name"
echo "$list"
} | awk 'NR == 1 { printf "%s : ", $1; next }
{ printf "%s%s", pad, $1; pad = ", " }
END { printf "\n" }'
fi
done < input.txt
base=“/a/b”
读名字的时候
做
列表=$(查找“$base”-键入f-print | xargs grep-l“$name”)
如果[-z“$list”]
然后回显“$name:未找到结果”
else{echo“$name”
回显“$list”
}| awk'NR==1{printf“%s:,$1;next}
{printf“%s%s”,pad$1;pad=“,”}
结束{printf“\n”}
fi
完成
如果您想要更巧妙的格式设置(例如,删除$base
中的前缀路径)或拆分长行,您可以添加该选项。我会在处理echo“$list”
输出的sed
脚本中删除前缀;更巧妙的格式化需要更复杂的awk
脚本
在Mac OS X 10.7.5上使用bash
etc进行测试-不是Solaris。考虑到文件名的假设,唯一轻微的问题是在awk
脚本中使用next
。如果有必要的话,有一些方法可以解决这个问题,但是替代脚本并不像上面的版本那么干净(尽管它并没有可怕的糟糕)。听起来很有用grep-F-F文件文件…
可能也是-o
。我尝试了-find dirname-exec egrep-n-F输入文件“{}”-谢谢乔恩,这解决了我的问题。我对格式没问题,所以不需要awk脚本。