shell脚本在多个文件中查找多个字符串,然后像“string - filename”

时间:2013-04-22 04:53:07

标签: shell solaris

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

input.txt -

name1
name2
name3
name4

dir - /a/b/

输出 -

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

1 个答案:

答案 0 :(得分:0)

许多在Linux上被认为是理所当然的便利设施在Solaris(至少Solaris 10及更早版本)上不可用。例如,grep命令不会使用-r选项,find不支持+而不是;。这让生活变得更加生动。

我将假设您的文件名(以及搜索到的名称)不包含空格或换行符(或其他导致问题的字符)。我还假设您使用kshbash而不是/bin/sh,因此使用$(...)而不必使用反向标记是可行的。

您的要求分为三部分:

  1. 阅读要搜索的名称列表。
  2. 查找包含这些名称的文件。
  3. 格式化查找文件的结果。
  4. 这可以通过以下方式解决:

    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。如果有必要,有办法解决这个问题,但替代脚本不像上面那个版本那么干净(尽管它并没有那么糟糕)。