linux - Grep-ing 不可搜索的文件

标签 linux bash grep stdin

当使用设备、套接字、管道或 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 icanonreset 启用,因为行缓冲允许您在大多数 CLI 程序中使用退格键。

关于linux - Grep-ing 不可搜索的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335271/

相关文章:

linux - 在文件中每第 n 次出现字符时插入内容

awk - 无法删除没有标签/<none> 标签的 docker 图像

linux - 在 Linux 上比较文件 A 和文件 B(部分匹配)

linux - 仅当 csv 中的第二个字段为 yes 时,才将 csv 文件中的单词剪切为文本文件

linux - docker compose 中的 secret

linux - 解压缩 .lzo 文件,然后删除 .lzo 文件

linux - 为什么系统调用需要中断

Bash Sed 查找并替换为特殊字符

linux - Bash - 将带有反斜杠的用户名回显到文件

python - 如何打印包含某些特定模式的程序的完整功能摘录