我想使用grep
或其他合适的工具来查找(和打印)线条,不是基于某种模式,而是基于长度。
假设我有一个包含两行的文件,其中
- 第 1 行:长度 = 300 个字符
- 第 2 行:长度 = 120 个字符
我正在寻找一个只输出第 2 行的命令。
答案1
正好 120 个字符
和grep
:
grep -xE '.{120}' < your-file
grep -x '.\{120\}' < your-file # more portable
和awk
:
awk 'length == 120' < your-file
0 到 120 个字符
和grep
:
grep -xE '.{0,120}' < your-file
grep -x '.\{0,120\}' < your-file # more portable
和awk
:
awk 'length <= 120' < your-file
为了严格小于 120,将 120 替换为 119<=
或<
。
120 个字符或以上:
和grep
:
grep -E '.{120}' < your-file # lines that contain a sequence of 120 characters
grep '.\{120\}' < your-file # more portable
还有一些其他选择:
grep -E '^.{120}' < your-file # lines that start with a sequence of 120 characters
grep '^.\{120\}' < your-file # more portable
grep -xE '.{120,}' < your-file # lines that have 120 or more characters
# between start and end.
grep -x '.\{120,\}' < your-file # more portable
和awk
:
awk 'length >= 120' < your-file
为了严格超过120,将 120 替换为 121 或者>=
替换为>
。
这些假设输入是根据区域设置的字符映射正确编码的有效文本。如果输入包含 NUL 字符、不形成有效字符的字节序列、大于LINE_MAX
(以字节数计)的行或未分隔的最后一行(在grep
;的情况下awk
将添加缺少的分隔符),您的里程可能会有所不同。
如果您想根据字节数而不是字符数进行过滤,请将区域设置设置为C
或POSIX
( LC_ALL=C grep...
)。
要根据字素簇的数量而不是字符进行过滤,并且如果您grep
支持某个-P
选项,则可以将 替换E
为P
上面.
和\X
。
比较:
$ locale charmap
UTF-8
$ echo $'e\u0301te\u0301' | grep -xP '\X{3}'
été
$ echo $'e\u0301te\u0301' | grep -xE '.{5}'
été
$ echo $'e\u0301te\u0301' | LC_ALL=C grep -xE '.{7}'
été
(即été
3 个字素簇、5 个字符、7 个字节)。
并非所有grep -P
实现都支持\X
.有些仅支持 UTF-8 多字节字符映射。
请注意,基于显示宽度的过滤又是另一回事,给定字符串的显示宽度取决于显示设备。请参阅获取字符串的显示宽度了解更多相关信息。