Grep 显示找到的文件名和字符串

Grep 显示找到的文件名和字符串

我需要一个 egrep 命令来列出所有包含单词 + 它找到的字符串的文件名。让我们想象一下这种情况:

我需要查找的单词:applewatermelonbanana

我需要:我想列出包含其中任何一个的所有文件(不需要将它们全部放在同一个文件中),并打印在文件中找到的单词。我想要的搜索结果示例:

./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

相关内容