Unix 在匹配行之前显示文件名

Unix 在匹配行之前显示文件名,unix,grep,Unix,Grep,如何让grep在其输出中的匹配行之前显示文件名?试试这个小把戏,诱使grep认为它正在处理多个文件,以便显示文件名: grep 'pattern' file /dev/null 还要获取行号,请执行以下操作: grep -n 'pattern' file /dev/null 如果您有可用的选项-H和-n(man grep是您的朋友): 选项: -H、 --使用文件名 打印每个匹配项的文件名。这是存在时的默认值 要删除的文件超过一个 搜索 -n、 --行号 在输出的每一行前面加上其内部以1为基

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

试试这个小把戏,诱使
grep
认为它正在处理多个文件,以便显示文件名:

grep 'pattern' file /dev/null
还要获取行号,请执行以下操作:

grep -n 'pattern' file /dev/null

如果您有可用的选项
-H
-n
man grep
是您的朋友):

选项:

-H、 --使用文件名

打印每个匹配项的文件名。这是存在时的默认值 要删除的文件超过一个 搜索

-n、 --行号

在输出的每一行前面加上其内部以1为基础的行号 输入文件。(-n是 由POSIX指定。)


-H
是GNU扩展,但是
-n

怎么样,我之所以能够做到这一点,部分要感谢这篇文章

您希望在多个具有模式(例如,
/logsap1,/logsap2
)的目录中查找多个文件,比如具有不同名称但具有模式的日志(例如,
filename=logfile.DATE
)。 每个文件都有一个您想要grep的模式(例如,
“init time”
),并且您想要拥有每个文件的
“init time”
,但知道它属于哪个文件

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt
然后,
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
大体上

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt
说明:

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

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

这将是
grep“”模式{}

然后让
grep
显示文件名
\dev\null

最后,用
tee outputfile.txt

这在
grep
version9.0.5build1989中对我有效

grep 'search this' *.txt
为我搜索所有的.txt文件而工作(当然,输入您自己的搜索值)。

无需技巧

grep --with-filename 'pattern' file
使用行号:

grep -n --with-filename 'pattern' file

这是对以前解决方案的一个轻微修改。我的示例在bash脚本中查找stderr重定向:

grep“2>”$(find.-name“*.bash”)

请告诉你的grep版本
grep--version
kent,
grep--version
是用来知道grep版本的命令吗?如果是,它就不起作用了。找不到任何其他命令来知道grep版本。这个问题问得好,但“Os version”是一个令人困惑的示例文件名Os&version在这里是不相关的。
grep'pattern'*
是的,它起作用了。你能告诉我在这个命令中添加
/dev/null
有什么意义吗?如果
grep
提供了多个文件名,它会在匹配之前自动显示文件名,但是如果只有一个输入文件,它会保留文件名。使用
/dev/null
作为一个额外的输入文件
grep
“认为“它处理多个文件,但是/dev/null当然是空的,因此它不会显示在匹配列表中..使用/dev/null是一个聪明的技巧,但我认为下面建议的-H标志是一个更好的答案。好的,但是grep的
-H
选项不是POSIX的一部分,并且使用的操作系统是Solaris 10,其中标准grep和,POSIX兼容版本的grep也没有
-H
选项。如果您将grep与find一起使用,如
find,这一点很重要-名称foo-execgrep模式{}\
-假设子目录中有大量名为
foo
的文件,
find
仍然同时处理
grep
一个文件。
/dev/null
技巧似乎在我尝试过的所有linux/osx版本中都能奏效,真是太好了!请注意,我认为
-H
更干净,但如下所述,您的
grep
版本可能不支持它。不,
-H
在这里不受支持。受支持,但它始终提供grep:file:ubuntu-H和-n上没有这样的文件或目录。可能是因为所有更新版本的*nixI多年来一直在努力解决这个问题,而没有想到会有这些选择!或者只使用find
find./path_pattern/to_files-type f-name“files*.log”-exec grep-Hn pattern{}
@codeforester我不知道还有其他的
grep,所以我不知道。酷!这在linux上是有效的。如果使用mac,则可以使用brew安装coreutils。还记得将PATH=“/usr/local/opt/coreutils/libexec/gnubin:$PATH”添加到您的中。bashrcThis(我想也是)在(1.0.17)中工作过。它适用于我内置的MacGrep(2.5.1-FreeBSD)。但要使用自制的替代grep,另一种方法是运行
brew安装grep
,然后只使用
ggrep
。不需要修改路径。
grep -n --with-filename 'pattern' file