【问题标题】:Does "grep" have maximum of files it can handle?“grep”是否有它可以处理的最大文件?
【发布时间】:2013-11-19 20:46:32
【问题描述】:

我刚刚跑了:

grep ""  *.txt > out.txt 

在 1500 个文件上。输出只包含几百个文件。为什么?

使用时:

cat  *.txt > out.txt 

这可行,但我希望文件名作为行名。

谢谢!

【问题讨论】:

  • 您收到错误消息了吗? grep有多种实现方式; grep --version 打印有用的东西吗?所有*.txt 文件实际上都是文本文件吗?
  • grep (BSD grep) 2.5.1-FreeBSD。是的,它们都是同一类型。没有错误。
  • 有些是空的,有关系吗?
  • 空文件应该没有任何区别。试试这个:ls *.txt | wc -l ; grep "" *.txt | wc -l ; cat *.txt | wc -l——第一个应该告诉你有多少*.txt文件;第二个和第三个应该给你相同的结果。
  • 我得到三个值:1452 2118 21634。第一个是文件数。另一个是什么?

标签: shell unix command-line grep cat


【解决方案1】:

我建议使用:

ls -l *.txt | cut -b 51-

在传递给catgrep 之前,您的终端也会扩展*.txt。所以是的,理论上你可以传递给命令的文件参数数量是有限制的。

  • ls -l *.txt 为您提供目录中的文件列表。
  • | 是一个管道,表示您可以将上一个命令的输出传递到下一个命令。
  • cut -b 51- 表示您切断了前 50 个字节,从而为您提供了文件名。

【讨论】:

  • @user2966591 我刚刚添加了一个解释。然而,鲁本斯的回答在这里更加优雅:stackoverflow.com/a/19849001/1267329
  • 非常好!我的意思是将文件名作为一列包含在新文件中。但现在我可以使用这个和 cat 命令,然后合并它们。谢谢!
  • 等等,这不起作用,因为在 1500 个文件中的每一个文件中都有不止一行!我想要一列告诉它来自哪个文件。
【解决方案2】:

您确定所有文件都显示在cat *.txt > out 中吗?除非您正处于每个命令的最大字符数的边缘,否则它不应该有所作为。试试这个:

ls -1 | egrep '\.txt$' | xargs egrep "" /dev/null > out

ls -1 列出目录中的所有文件,每行一个文件名,第一个egrep 只过滤掉以“.txt”结尾的文件。这样,您不必担心列出文件时命令行长度不足。 xargs 读取为 stdin,直到它在 xargs 的其他参数之后的单个命令行上获得尽可能多的行。然后它调用您提供的命令,并使用您为该组输入参数提供的选项。 xargs 然后重复该过程,直到用完您提供的所有参数。每次调用最终的 egrep 都会写入同一个 stdout,因此所有输出都会写入同一个文件。

/dev/null 存在于xargs 仅找到一行输入的情况下(例如,因为您只有一个文件或捆绑文件时,最后一个捆绑包只有一个文件)。如果您使用单个文件调用egrep,它不会打印文件名。既然你特别说你想要文件名,告诉egrep 搜索/dev/null 保证总会有至少两个文件。由于/dev/null 保证为空,因此您将永远无法在其中找到任何内容,也不会出现在您的输出中。

xargsfind 配合使用效果很好。如果要在当前目录及其子目录的所有“.txt”文件中搜索“foo”:

find . -name "*.txt" -print | xargs egrep foo /dev/null

会成功的。如果文件名中包含空格,它们将不会被引用,egrep 会混淆,因此请使用find 上的-print0 选项和xargs 上的-0 选项:

find . -name "*.txt" -print0 | xargs -0 egrep foo /dev/null

【讨论】:

  • 如果您将-H 标志添加到egrep,您将能够删除/dev/null 参数。
  • @iscfrc 好提示。几年前,我在没有 -H 的 grep 版本上学习了 /dev/null 技巧。
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多