【问题标题】:Implications of LC_ALL=C to speedup grepLC_ALL=C 对加速 grep 的影响
【发布时间】:2011-12-29 14:27:20
【问题描述】:

我刚刚发现,如果我在我的 grep 命令前加上 LC_ALL=C,它对于加快 grep 的速度确实很神奇。

但我想知道其中的含义。

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

【问题讨论】:

  • 什么版本的grep?在 2.7.1 或 2.7.3 之前的某个地方有一个讨厌的 UTF 错误。我假设它的 GNU grep,BSD grep 总是很慢。

标签: bash shell grep


【解决方案1】:

您不一定需要 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 的任何子集以及匹配没有备用二进制表示的单个字符应该可以正常工作,无论语言环境如何。

【讨论】:

  • 所以如果我没看错的话:grep 文件和模式列表只包含 ascii 字符,一切都应该没问题吗?
  • 是的,你可以使用纯 ASCII。至少在实践中,理论上它可能是 EBCDIC。
  • 什么是||?某种 if 语句?
  • 如果我正确理解了这个答案,是否意味着使用LC_ALL=C 从来没有危险,并且应该优先于其他语言环境?
猜你喜欢
  • 1970-01-01
  • 2015-08-09
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多