“grep”是否拥有最多可以处理的文件?

时间:2013-11-07 23:37:59

标签: shell unix command-line grep cat

我跑了:

grep ""  *.txt > out.txt 

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

使用时:

cat  *.txt > out.txt 

这有效,但我希望文件名为行名。

谢谢!

2 个答案:

答案 0 :(得分:1)

您确定所有文件都真正显示在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保证为空,因此您永远不会在其中找到任何内容,并且它不会显示在您的输出中。

xargs适用于find。如果要在当前目录及其子目录中的所有“.txt”文件中搜索“foo”:

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

会做到这一点。如果您的文件名中包含空格,则不会引用它们,egrep会混淆,因此请使用-print0上的find选项和-0选项xargs的:

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

答案 1 :(得分:0)

我建议使用:

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

您的终端也会*.txt扩展cat,然后传递给grepls -l *.txt。所以是的,从理论上讲,你可以传递给命令的文件参数有一个限制。

  • |为您提供目录中的文件列表。
  • cut -b 51-是一个管道,意味着您可以将上一个命令的输出传递给下一个命令。
  • {{1}}表示您切断了前50个字节,并为您提供了文件名。