使用grep命令输出来查找命令

时间:2011-04-27 09:36:04

标签: shell find grep

我遇到了在几个文件中搜索模式的问题。

我想搜索“Logger”。 jsp文件中的模式,所以我使用了命令

grep -ir Logger. * | find . -name *.jsp

现在我遇到的问题是这个命令列出了所有的jsp文件,而不是搜索模式“Logger”。在jsp文件中并列出它们。

我只想要jsp文件中的“Logger”。实例存在。

4 个答案:

答案 0 :(得分:2)

像这样开始 你想在jsp文件中搜索。

find . -name "*.jsp"

以上将从当前目录递归输出所有jsp文件。如下所示

1/2/ahbd.jsp
befwej/dg/wefwefw/wefwefwe/ijn.jsp

现在你想在这些文件中找到字符串。

grep -ir Logger. (output of find)

所以实际的完整命令变为:

find . -name "*.jsp"|xargs grep -ir 'Logger.'
这里的魔法由xargs完成 它将find的输出作为grep的输入逐行输出。 如果删除xargs,则只会搜索1/2/ahbd.jsp的第一行以查找该字符串。

还有其他几种方法可以做到这一点。但我觉得使用这种方法感觉更舒服

答案 1 :(得分:1)

以递归方式查找包含字符串*.jsp的所有Logger.个文件:

find . -type f -name '*.jsp' -exec grep -l "Logger\." {} \;

grep -l表示如果文件包含字符串,则仅打印文件名 -exec的{​​{1}}开关将为符合其他条件(find-type f)的每个文件执行给定命令。字符串-name '*.jsp'由文件名替换。某些版本的{}也支持find而不是+来为命令提供多个文件名(例如{}),而不仅仅是一次,例如:

xargs

答案 2 :(得分:0)

你可以只使用grep,这是一个可以给你结果的命令:

grep -ir "Logger\." * | grep ".jsp"

问题是,如果您的根目录中没有至少一个 .jsp 文件,那么当您使用“ .jsp”或“”时,grep会保释。所以我们必须告诉他查看每个文件。

由于你给grep -r(递归)参数,它将遍历子目录以找到模式“Logger。”,然后第二个grep将只显示.jsp文件。请注意-i告诉grep不要关心字母大小写,这可能不是你想要的。

编辑:遵循John的回答:我们必须逃避.以防止将其视为正则表达式。

重新编辑:实际上,我认为使用find更好,因为它会直接过滤 jsp 文件而不是grepping所有文件:

find . -name "*.jsp" -exec grep -i "Logger\." {} \;

(因为find负责递归,所以不再需要-r

答案 3 :(得分:0)

如果你有bash 4 +

shopt -s globstar
shopt -s nullglob
for file in **/*.jsp
do
  if grep -q "Logger." "$file" ;then
    echo "found in $file"
  fi
  # or just grep -l "Logger." "$file"
done