man*_*ork 107
根据我的测试,按照降低速度的顺序(在 UTF-8 语言环境和 ASCII 输入的 GNU 系统上):
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Run Code Online (Sandbox Code Playgroud)
除了perl
¹一个(或awk
/ grep
/sed
实现(像mawk
或busybox的),其不支持多字节字符),该计数的数量而言的长度字符(根据LC_CTYPE
语言环境的设置),而不是字节。
如果输入中的字节不构成有效字符的一部分(有时会在语言环境的字符集为 UTF-8 且输入采用不同编码时发生),则根据解决方案和工具实现,这些字节要么算作 1 个字符,要么算作 0 或不匹配.
。
例如,包含 30 a
sa 0x80 字节、30 b
s、0x81 字节和 30 UTF-8 é
s(编码为 0xc3 0xa9)的行,在 UTF-8 语言环境中将.\{80\}
与 GNU grep
/不匹配sed
(因为独立的 0x80 字节不匹配.
),长度为 30+1+30+1+2*30=122 with perl
or mawk
,3*30=90 with gawk
.
如果你想以字节为单位来算,固定区域设置C
使用LC_ALL=C grep/awk/sed...
。
这将使所有 4 个解决方案都认为上面的行包含 122 个字符。除了 inperl
和 GNU 工具之外,对于包含 NUL 字符(0x0 字节)的行,您仍然会有潜在的问题。
¹perl
行为可能会受到PERL_UNICODE
环境变量的影响