bash - LC_ALL=C 对加速 grep 的影响

标签 bash shell grep

我刚刚发现,如果我在我的 grep 命令前加上一个 LC_ALL=C,它会对加快 grep 速度产生奇迹。

但我想知道其中的含义。

使用 UTF-8 的模式会不匹配吗? 如果 grepped 文件使用 UTF-8 会怎样?

最佳答案

您不一定需要 UTF-8 在这里遇到麻烦。语言环境负责设置字符类,即确定哪个字符是空格、字母或数字。考虑这两个例子:

$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep '[[:alnum:]]' || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep '[[:alnum:]]' || echo false
false

当尝试将精确的二进制模式相互匹配时,语言环境并没有什么区别,但是:

$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep "$(echo -e '\xe4')" || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep "$(echo -e '\xe4')" || echo false
ä

我不确定 grep 实现 unicode 的程度,以及不同代码点之间的匹配程度,但是匹配 ASCII 的任何子集和没有备用二进制表示的单个字符的匹配应该可以正常工作,而不管语言环境如何。

关于bash - LC_ALL=C 对加速 grep 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8138124/

相关文章:

bash - Expect Script - 修复奇怪的终端大小调整行为

linux - egrep : find lines with no characters

linux - 在 awk 命令中使用 '\n' 作为字段分隔符

linux - 从 crontab 运行脚本时从 Shell 脚本写入文件

python - 如何在 Python 中实现常见的 bash 习语?

bash - 递归查找文件类型列表

linux - Shell 脚本打印特定索引的行值

shell - 使用 shell 脚本创建包含某些内容的文件

bash - 将 sed 放入 "for cycle"

linux - 如何在 Linux 中使用 grep 找出一行中的单词?