![Grep 输出问题](https://linux22.com/image/114535/Grep%20%E8%BE%93%E5%87%BA%E9%97%AE%E9%A2%98.png)
好的,我在外部硬盘上使用 grep
例子,
M:/
grep -rhI "bananas" . > out.txt
这将输出“M:/”中包含“banana”的任何行
但是,我想输出文件的全部内容,因此,如果 example.txt 中的一行包含“bananas”,则输出 example.txt 的全部内容,并且目录“M:/”中包含的任何其他 .txt 文件也是如此。 “ 香蕉 ”。
答案1
grep -r "bananas" | cut -d: -f1 | xargs cat >> result.txt
grep
-r
: 递归。递归读取每个目录下的所有文件,
结果:file_name:text
对于每一行。例如foo.txt:bananas
。
我们现在需要从每一行获取文件名。
切
用于删除部分行的简单编辑器(您可以在此处使用sed
或,awk
但剪切很简单)
-d
分隔符。因为我们有:
后文件,所以这是我们的分隔符:-d:
-f
我们将输出拆分为字段。该拿哪一张?-f1
- 第一!
参数
我们现在有了文件列表。跟他们有关系吗?我们使用xargs
它从标准输入构建和执行命令行。它接受标准输入上的文件名,并cat
为提供文件名作为参数的每一行运行。并cat
简单地将其内容打印到标准输出。
>>
意思是“附加到文件”
答案2
grep -rlZI "bananas" . | xargs -0 cat > out.txt
输出-lZ
匹配文件名称的空分隔列表:
-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.
-Z, --null
Output a zero byte (the ASCII NUL character) instead of the
character that normally follows a file name. For example, grep
-lZ outputs a zero byte after each file name instead of the
usual newline. This option makes the output unambiguous, even
in the presence of file names containing unusual characters like
newlines. This option can be used with commands like find
-print0, perl -0, sort -z, and xargs -0 to process arbitrary
file names, even those that contain newline characters.
如果您的 grep 版本不提供该-Z
选项,那么您可以退回到 plain ,只要您将分隔符也-l
设置为换行符,它仍然可以处理包含空格的文件名(显然不包括换行符) :xargs
grep -rlI "bananas" . | xargs -d '\n' cat > out.txt