Grep 输出问题

Grep 输出问题

好的,我在外部硬盘上使用 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

相关内容