Grep-ing不可搜索的文件

时间:2015-05-19 20:12:46

标签: linux bash grep stdin

当使用不可搜索的文件(如设备,套接字,管道或fifos)时,grep如何为读取行分配缓冲区?

我尝试过以下

year = params[:dyear]
year = Time.now.year.to_s unless year.present?

我输入一行包含大约9484个字符(包括空格)。 Grep处理了一些字符(我估计在4K左右)并将这些字符打印到屏幕上。输入行不包含hello(我只是重复了一行"一种方法是简单地将二进制文件视为文本")。没有错误消息,grep刚刚退出。

grep应该与不可搜索的文件一起使用吗?如果是这样,它如何管理缓冲区?

编辑:重现它的步骤。 我输入

后,将文本编辑器(sublime text2)中的9484个字符粘贴到ubuntu的终端中
grep hello -

然后我按下control + d结束输入。

我无法使用"那个其他人"的方式重现它。如以下所说的。它似乎在我做的时候有用

grep hello -

2 个答案:

答案 0 :(得分:2)

正如管道示例所示,grep非常乐意匹配来自不可搜索来源的任何长度输入。 GNU grep特别允许任意行长度。

您遇到的问题是粘贴长行时终端的行缓冲区填满。此缓冲区为4096 bytes

您可以在该终端中使用stty -icanon禁用线路缓冲,并且可以看到grep现在很乐意匹配您粘贴的任何线路,无论其长度如何。

确保在测试后使用stty icanonreset进行渲染,因为行缓冲是允许您在大多数CLI程序中使用退格的原因。

答案 1 :(得分:1)

像许多其他unix工具一样,

grep基于行工作。也就是说,它永远不必在内存中保留多于一行。有两种方法可以解决这个问题:

  1. (重新)使用单个缓冲区,只要遇到不适合此缓冲区的行,就会生成。

  2. 类似grep的工具使用readline()功能。

  3. 第一种选择可能会更有效率,第二种选择肯定更方便。