我想编写一个 shell 脚本,它从文件中获取输入并在目录中的多个文件中搜索该字符串。我已经成功编写了一个脚本,显示文件名包含匹配的字符串。但我也想打印输入字符串名称。
输入.txt -
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
例如,删除 中的前缀路径)或分割长行,您可以添加它。我会在sed
处理输出的脚本中删除前缀echo "$list"
;更聪明的格式需要更复杂的awk
脚本。
bash
在 Mac OS X 10.7.5 上用 etc 测试——不是 Solaris。鉴于文件名假设,唯一值得关注的轻微原因是next
在awk
脚本中的使用。如有必要,有一些方法可以解决这个问题,但替代脚本不如上面的版本干净(尽管它不是可怕的糟糕)。