shell脚本,用于在多个文件中查找多个字符串,然后像;字符串-文件名“;

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

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

input.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=“/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脚本。