我遇到了在几个文件中搜索模式的问题。
我想搜索“Logger”。 jsp文件中的模式,所以我使用了命令
grep -ir Logger. * | find . -name *.jsp
现在我遇到的问题是这个命令列出了所有的jsp文件,而不是搜索模式“Logger”。在jsp文件中并列出它们。
我只想要jsp文件中的“Logger”。实例存在。
答案 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