在匹配行(grep)之前显示文件名

Viv*_*vek 262 unix grep

如何grep在输出中的匹配行之前显示文件名?

Scr*_*zer 414

尝试这个小技巧来哄骗grep它认为它处理多个文件,以便它显示文件名:

grep 'pattern' file /dev/null
Run Code Online (Sandbox Code Playgroud)

要获得行号:

grep -n 'pattern' file /dev/null
Run Code Online (Sandbox Code Playgroud)

  • 如果`grep`提供了多个文件名,它将在匹配前自动显示文件名,但如果是单个输入文件,它将保留文件名.通过使用`/ dev/null`作为额外的输入文件`grep`"认为"它处理多个文件,但/ dev/null当然是空的,所以它不会显示在匹配列表中. (49认同)
  • 使用/ dev/null是一个聪明的伎俩,但我认为-H标志下面的建议是一个更好的答案. (29认同)
  • 好的,但grep的`-H`选项不是POSIX的一部分,使用的操作系统是Solaris 10,其中标准grep和兼容POSIX的版本的grep都没有`-H`选项. (20认同)
  • 是的,它奏效了.你能告诉我在这个命令中添加`/ dev/null`的意义吗? (5认同)
  • 如果你使用grep和find一样重要,比如`find.-name foo -exec grep pattern {} \;` - 假设在你的子目录中有很多名为`foo`的文件,`find`仍然只需要手动`grep`一个文件来操作.`/ dev/null`技巧似乎适用于我尝试的所有linux/osx风格,所以很荣幸!注意我认为`-H`更干净,但如下所述,_your_版本的`grep`可能不支持它. (3认同)

Chr*_*our 281

如果你有选择-H-n可用(man grep是你的朋友):

$ cat file
foo
bar
foobar

$ grep -H foo file
file:foo
file:foobar

$ grep -Hn foo file
file:1:foo
file:3:foobar
Run Code Online (Sandbox Code Playgroud)

选项:

-H, - with-filename

打印每个匹配的文件名.当有多个要搜索的文件时,这是默认设置.

-n, - line-number

在输入文件中使用基于1的行号为每行输出添加前缀.(-n由POSIX指定.)

-H可能是GNU扩展,但-n由POSIX指定.

  • 不,这里不支持`-H`. (3认同)
  • 适用于ubuntu -H和-n.可能与所有较新版本的*nix相同 (2认同)

MD *_* XF 43

没有必要的技巧.

grep --with-filename 'pattern' file
Run Code Online (Sandbox Code Playgroud)

使用行号:

grep -n --with-filename 'pattern' file
Run Code Online (Sandbox Code Playgroud)

  • @codeforester我不知道任何其他`grep`s,所以我不知道. (3认同)
  • 这只适用于GNU`grep`,对吧? (2认同)
  • 很酷!这适用于linux.如果您使用mac,可以使用brew安装coreutils.请记住向您的.bashrc添加PATH ="/ usr/local/opt/coreutils/libexec/gnubin:$ PATH" (2认同)
  • 这个(也)在[MinGW](http://en.wikipedia.org/wiki/MinGW)(1.0.17,我认为)中有效. (2认同)

小智 5

怎么样,我设法实现了这一点,部分归功于这篇文章。

您想filename=logfile.DATE在几个带有模式(例如/logsapp1, /logsapp2)的目录中找到多个文件,比方说名称不同但带有模式(例如)的日志。每个文件都有一个您想grep的模式(例如"init time"),并且您想拥有"init time"每个文件的模式,但要知道它属于哪个文件。

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt
Run Code Online (Sandbox Code Playgroud)

然后outputfilename.txt会像

./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms
Run Code Online (Sandbox Code Playgroud)

一般来说

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt
Run Code Online (Sandbox Code Playgroud)

说明:

find 命令将根据模式搜索文件名

然后,管道xargs -I{}会将find输出重定向到{}

这将是输入 grep ""pattern" {}

然后grep显示文件名的技巧\dev\null

最后,将输出写入文件 tee outputfile.txt

这在grep1989年的9.0.5版中对我有用。

  • 或仅使用find`/ find ./path_pattern/to_files -type f -name“ files * .log” -exec grep -Hn pattern {} \;` (3认同)