0

我想编写一个 shell 脚本,它从文件中获取输入并在目录中的多个文件中搜索该字符串。我已经成功编写了一个脚本,显示文件名包含匹配的字符串。但我也想打印输入字符串名称。

输入.txt -

name1
name2
name3
name4

目录 -/a/b/

输出 -

name1 : file1, file2
name2 : file1
name3 : no results found
name4 : file4
4

1 回答 1

0

许多在 Linux 上被视为理所当然的便利设施在 Solaris(至少 Solaris 10 和更早版本)上不可用。例如,grep命令不带-r选项,find不支持+代替;. 这让生活变得更加复杂。

我将假设您的文件名(以及搜索的名称)不包含空格或换行符(或其他会导致问题的字符)。我还将假设您使用kshbash不使用/bin/sh,以便使用$(...)而不是必须使用反引号。

您的要求分为三个部分:

  1. 阅读要搜索的名称列表。
  2. 查找包含这些名称的文件。
  3. 格式化查找文件的结果。

这可以通过以下方式解决:

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。鉴于文件名假设,唯一值得关注的轻微原因是nextawk脚本中的使用。如有必要,有一些方法可以解决这个问题,但替代脚本不如上面的版本干净(尽管它不是可怕的糟糕)。

于 2013-04-22T22:52:50.423 回答