我需要一个 egrep 命令来列出所有包含单词 + 它找到的字符串的文件名。让我们想象一下这种情况:
我需要查找的单词:apple
、watermelon
和banana
。
我需要:我想列出包含其中任何一个的所有文件(不需要将它们全部放在同一个文件中),并打印在文件中找到的单词。我想要的搜索结果示例:
./file1.txt:apple
./file1.txt:banana
./file2.txt:watermelon
./file5.txt:apple
我记得看到过一个grep
显示FILENAME:STRING
在搜索结果中的命令,但我记不清它是怎么做的。我试过了:
egrep -lr 'apple|banana|watermelon' .
但搜索结果显示:
./file1.txt
./file2.txt
好的,它有帮助,但是...在 中file1
,它找到了哪一个单词?这就是我面临的问题。
答案1
您使用了-l
,这与您想要的正好相反。从man grep
:
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)
你想要的是-H
:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
但无论如何,这是默认设置。只需执行:
grep -Er 'apple|banana|watermelon' .
(-E
告诉grep
要像那样行动egrep
。)
答案2
使用 awk 的方法:
awk -v var1=apple -v var2=banana -v var3=watermelon '{ if($0~var1) {print FILENAME":"var1} ; if($0~var2) {print FILENAME":"var2} ; if($0~var3) {print FILENAME":"var3} }' *
基本上,声明 3 个变量和 3 个 if 语句来打印文件名和已找到的相应变量
编辑
简短版本:
awk '/watermelon/{ print FILENAME":watermelon" }; /banana/{print FILENAME":banana"}; /apple/ {print FILENAME":apple"}' *
基本思想是查找/regular expression/
并执行后面花括号中的代码(如果找到则打印FILENAME和我们找到的字符串)。
答案3
这是您要查找的命令:
grep -R "apple\|banana\|watermelon" <search_path>
-R 将读取每个目录下的所有文件搜索路径,以递归方式显示。每次匹配时都会显示文件名。
答案4
以下将为您提供您想要的输出(使用 bash):
for x in apple banana watermelon ; do grep $x * ; done
输出将为您提供包含搜索字符串的所有行。
以下将仅为您提供搜索字符串作为输出:
for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done