cut -c 按 unicode 字符位置截取,适用于格式固定的文本;cut -f 配合 -d 按分隔符提取字段,但不支持引号转义和缺失字段补空,需用 awk 等工具替代。

cut -c 按字符位置截取最直接
当文本格式固定(比如日志里时间总在前19位、IP总在第22–31位),cut -c 是最快的选择。它按 Unicode 字符计数,中英文都算 1 个字符,不拆字。
常见错误:把 -c 当成“字节”用,结果中文被截断成乱码——那是 -b 的事,-c 不会这样。
-
cut -c 1-10:取每行前 10 个字符 -
cut -c 5-:从第 5 个字符开始到行尾 -
cut -c 8:只取第 8 个字符(注意:不是下标 0,是 1-based) -
cut -c 1-4,10-15:取两段,中间跳过
cut -f 配合 -d 处理分隔符字段
cut 默认只认 Tab 作分隔符,写 cut -f2 却对着空格或逗号文件跑,八成没输出——因为整行被当成了第 1 列。
必须显式指定分隔符:-d',' 对 CSV,-d' ' 对空格(但注意:多个连续空格会被切出空字段,容易错位)。
- CSV 第三列:
cut -d',' -f3 file.csv - /etc/passwd 用户名:
cut -d: -f1 /etc/passwd(冒号无引号,不用转义) - 取第 1 和第 4 列:
cut -d',' -f1,4 data.txt - 跳过表头?
cut自己做不到,得套tail -n +2 file | cut -d',' -f2
字段缺失时 cut 直接跳行,不是 bug 是设计
报错 fields not delimited or delimiter not found 不代表命令写错了,而是某行压根没出现你指定的分隔符(比如 CSV 中某行漏了逗号)。cut 默认把这整行当第 1 列,但你写了 -f2,它找不到第 2 列,就静默跳过该行。
想让缺失字段输出空字符串?cut 不支持。这时候该换 awk -F',' '{print $2}',它对缺字段默认补空。
- 调试先看真实分隔符:
head -3 file | cat -A,Tab 显示为^I,空格就是空格 - 加
-s可让cut跳过不含分隔符的行(避免混入脏数据) - 加
--complement能反选,比如cut -d',' -f1,3 --complement输出除第 1、3 列外的所有列
别混用 -c 和 -f,也别指望 cut 处理带引号的 CSV
-c 和 -f 是两套互斥逻辑:一个按位置硬切,一个按分隔符软分。同时用会报错,shell 直接拒绝执行。
更关键的是,cut 完全不识别引号。遇到 "a,b",c 这种字段内含逗号的 CSV,cut -d',' -f1 会错切成 "a,而不是 "a,b"。这种场景必须换 awk、csvkit 或 Python 的 csv 模块。
它的优势边界很清晰:分隔符干净、字段位置固定、不需要判断或转义。快、轻、POSIX 兼容,但也仅此而已。











