当使用设备、套接字、管道或 fifos 等不可搜索的文件时,grep 如何为读取行分配缓冲区?
我尝试了以下操作
grep hello -
我给了一行包含大约 9484 个字符(包括空格)的输入。 Grep 处理了一些字符(我猜是 4K 左右)并将这些字符打印到屏幕上。输入行不包含 hello(我只是重复了行“一种方法是简单地将二进制文件视为文本”)。没有错误消息,grep 刚刚退出。
grep 是否应该处理不可搜索的文件?如果是这样,它如何管理缓冲区?
编辑:重现它的步骤。 输入后,我将文本编辑器(sublime text2)中的 9484 个字符复制粘贴到 ubuntu 的终端中
grep hello -
然后我按下control+d结束输入。
我无法使用下面提到的“那个人”的方式重现它。当我这样做时它似乎有效
while printf "One way is to simply treat binary files as text anyway "; do true; done 2> /dev/null | head -c 9484 | grep hello -
最佳答案
如管道示例所示,grep
非常乐意匹配来自不可搜索源的任何长度输入。 GNU grep 特别允许任意行长度。
您看到的问题是,当您粘贴长行时,终端的行缓冲区会填满。这个缓冲区是 4096 bytes .
您可以在该终端中使用 stty -icanon
禁用行缓冲,并看到 grep
现在可以愉快地匹配您粘贴的任何行,无论其长度如何。
确保在测试后使用 stty icanon
或 reset
启用,因为行缓冲允许您在大多数 CLI 程序中使用退格键。
关于linux - Grep-ing 不可搜索的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335271/