如何从多个文件中获取特定文件结果的行号
How to grep the line number of result of that particular file, from multiple files
我正在尝试使用 grep 从多个文件中输出结果的行号。
示例:
文件 1 的名称是 test1.zip
; test1.zip
里面的内容是
123
234
文件 2 的名称是 test2.zip
; test2.zip
里面的内容是
456
789
现在,这只是一个简化的场景。在实际场景中,我有多个这样的文件。
现在,我正在这样做:
gunzip -c test* | grep -n 789
结果是
4;789
但我想看到的是
2;789
因为789是它自己文件中的第二行,test2.zip
.
我怎样才能做到这一点?
Grep 只能看到行流,无法知道文件何时结束和新文件何时开始,因此它不知道每个文件的行号。
您可以直接使用 zgrep
,而不是将 gunzip
的输出通过管道传递给 grep:
$ zgrep -n 789 test*
test2.gz:2:789
如果你没有zgrep
,你可以使用find
和-exec
如下:
$ find -name 'test*' -exec bash -c 'gunzip -c "" | grep -n 789 ' _ {} \;
2:789
这会找到所有匹配 test*
的文件并在它们上运行您的管道。将管道引入 find -exec
的方法是使用 bash -c 'command' _ {}
生成子 shell,然后将 command
中的文件名引用为 </code>.</p>
<p>这确实给了你想要的结果,但如果你还想要文件名,如果 <code>-exec
成功退出,你可以打印它:
$ find -name 'test*' -exec bash -c 'gunzip -c "" | grep -n 789 ' _ {} \; -print
2:789
./test2.gz
我正在尝试使用 grep 从多个文件中输出结果的行号。
示例:
文件 1 的名称是 test1.zip
; test1.zip
里面的内容是
123
234
文件 2 的名称是 test2.zip
; test2.zip
里面的内容是
456
789
现在,这只是一个简化的场景。在实际场景中,我有多个这样的文件。
现在,我正在这样做:
gunzip -c test* | grep -n 789
结果是
4;789
但我想看到的是
2;789
因为789是它自己文件中的第二行,test2.zip
.
我怎样才能做到这一点?
Grep 只能看到行流,无法知道文件何时结束和新文件何时开始,因此它不知道每个文件的行号。
您可以直接使用 zgrep
,而不是将 gunzip
的输出通过管道传递给 grep:
$ zgrep -n 789 test*
test2.gz:2:789
如果你没有zgrep
,你可以使用find
和-exec
如下:
$ find -name 'test*' -exec bash -c 'gunzip -c "" | grep -n 789 ' _ {} \;
2:789
这会找到所有匹配 test*
的文件并在它们上运行您的管道。将管道引入 find -exec
的方法是使用 bash -c 'command' _ {}
生成子 shell,然后将 command
中的文件名引用为 </code>.</p>
<p>这确实给了你想要的结果,但如果你还想要文件名,如果 <code>-exec
成功退出,你可以打印它:
$ find -name 'test*' -exec bash -c 'gunzip -c "" | grep -n 789 ' _ {} \; -print
2:789
./test2.gz