cut 命令从每个输入行中选择指定的字符位置或字段。它最适合处理分隔符和字段位置已知且结构一致的文本。
为示例创建一个以制表符分隔的小文件。printf 会把 \t 解释为字面制表符,把 \n 解释为换行符:
$ printf 'name\trole\nalice\tadmin\nbob\tviewer\n' > team.tsv
文本操作 · 第 6 课
学习使用 cut 从每行中选择字符位置或带分隔符的字段。
cut 命令从每个输入行中选择指定的字符位置或字段。它最适合处理分隔符和字段位置已知且结构一致的文本。
为示例创建一个以制表符分隔的小文件。printf 会把 \t 解释为字面制表符,把 \n 解释为换行符:
$ printf 'name\trole\nalice\tadmin\nbob\tviewer\n' > team.tsv
使用 -c LIST 从每行选择位置。位置从 1 开始:
$ cut -c 1 team.tsv
n
a
b
列表可以包含单个位置和范围:
$ cut -c 1-4 team.tsv
name
alic
bob
$ cut -c 1,3 team.tsv
nm
ai
bb
空格、制表符和标点符号同样会占用位置。cut 会独立处理每一行。
哪个命令会打印 names.txt 每一行的第一个字符?
使用 -f LIST 选择字段。默认分隔符是制表符:
$ cut -f 2 team.tsv
role
admin
viewer
与字符选择一样,列表可以使用 1、1,3、2-4、-3 或 2- 等值。
哪个命令会打印 team.tsv 每一行中以制表符分隔的第二个字段?
字段使用制表符之外的分隔符时,请把 -d CHARACTER 与 -f 结合使用。下面创建以分号分隔的数据:
$ printf 'alice;admin\nbob;viewer\n' > team.txt
$ cut -d ';' -f 1 team.txt
alice
bob
这种形式的分隔符是一个字符。需要给 ; 加引号,因为未加引号的分号在 shell 中具有控制含义。
哪个命令会打印 team.txt 中以分号分隔的第二个字段?
在字段模式下,如果某行不含分隔符,cut 通常会原样打印该行。添加 -s 可以抑制这些行:
$ printf 'alice;admin\nheader\nbob;viewer\n' | cut -s -d ';' -f 2
admin
viewer
这并不能验证通用 CSV 文件。CSV 可能包含加引号的分隔符、嵌入换行符和转义规则,单字符切分无法理解这些结构;此类数据应使用支持 CSV 的工具。
在 cut -d ':' -f 1 中,-s 有什么作用?
未指定文件或使用 - 作为输入操作数时,cut 会读取 stdin,因此很适合作为管道的一环:
$ printf 'red:1\nblue:2\n' | cut -d ':' -f 1
red
blue
在 generate-data | cut -d ':' -f 1 中,cut 从哪里读取输入?
要练习位置和字段选择,可以尝试以下动手实验:
cut 从文本文件中提取指定列或字段。cut、grep、wc、sort 和 uniq 等文本工具。课程已完成
现在,你可以使用 cut 从面向行的文本中选择可预测的位置。
选择单个字符位置或范围。
使用 -f 提取制表符分隔字段。
使用 -d 提供单字符分隔符。
在适当时抑制不含分隔符的行。
从文件或 stdin 读取结构化文本。