我想编写一个shell脚本,它从文件中获取输入并在目录中的多个文件中搜索该字符串。我已成功编写一个脚本,显示文件名包含匹配的字符串。但我也要打印输入字符串名称。
input.txt -
name1
name2
name3
name4
dir - /a/b/
输出 -
name1 : file1, file2
name2 : file1
name3 : no results found
name4 : file4
答案 0 :(得分:0)
许多在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
中的前缀路径)或拆分长行,你可以添加它。我会在处理sed
输出的echo "$list"
脚本中删除前缀;更聪明的格式化需要更复杂的awk
脚本。
在Mac OS X 10.7.5上使用bash
等进行测试 - 而不是Solaris。鉴于文件名假设,唯一值得关注的是在next
脚本中使用awk
。如果有必要,有办法解决这个问题,但替代脚本不像上面那个版本那么干净(尽管它并没有那么糟糕)。