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多年来一直在努力解决这个问题,而没有想到会有这些选择!或者只使用findfind./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