当使用不可搜索的文件(如设备,套接字,管道或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 -
答案 0 :(得分:2)
正如管道示例所示,grep
非常乐意匹配来自不可搜索来源的任何长度输入。 GNU grep特别允许任意行长度。
您遇到的问题是粘贴长行时终端的行缓冲区填满。此缓冲区为4096 bytes。
您可以在该终端中使用stty -icanon
禁用线路缓冲,并且可以看到grep
现在很乐意匹配您粘贴的任何线路,无论其长度如何。
确保在测试后使用stty icanon
或reset
进行渲染,因为行缓冲是允许您在大多数CLI程序中使用退格的原因。
答案 1 :(得分:1)
grep
基于行工作。也就是说,它永远不必在内存中保留多于一行。有两种方法可以解决这个问题:
(重新)使用单个缓冲区,只要遇到不适合此缓冲区的行,就会生成。
类似grep
的工具使用readline()
功能。
第一种选择可能会更有效率,第二种选择肯定更方便。