cut默认仅识别Tab为分隔符,处理空格或逗号分隔需显式指定-d;不支持引号转义、字段缺失填充及复杂逻辑,适用场景限于分隔符统一且位置固定的列提取。

cut 默认用 Tab 分隔,但多数人实际用空格或逗号
直接 cut -f2 会失败,因为 cut 默认只认 Tab 作分隔符,不是空格、不是逗号、也不是连续空格。遇到 CSV 或空格对齐的文本,必须显式指定分隔符。
- 空格分隔:用
cut -d' ' -f2,但注意多个连续空格会被当成多个字段——cut不压缩空白,容易错位 - 逗号分隔(CSV):用
cut -d',' -f3,但无法处理带引号的逗号(如"a,b",c),这时cut就不该用 - Tab 分隔最安全:确认文件是真实 Tab(可用
cat -A file看^I),再用cut -f2,省略-d
取多列、跳过首行、按字符位置截取的写法差异
按列(-f)和按字节/字符(-c)是两套逻辑,混用会出错。比如日志里没有固定分隔符,只有对齐列,就得用 -c。
- 取第1、3、5列:
cut -f1,3,5 -d',' file.csv - 跳过表头再取:
tail -n +2 file.csv | cut -f2 -d',',不能用cut自己跳行 - 按固定宽度取字符(如取第10–15个字符):
cut -c10-15 file.log,注意这是字节位置,中文可能截半 -
-c和-f互斥,不能同时用
常见报错:fields not delimited or delimiter not found
这个错误不是语法错,而是某行根本没出现你指定的分隔符,cut 默认把整行当第1列,但如果你写了 -f2,它就找不到第2列,直接报错并跳过该行(不输出)。
- 加
--output-delimiter='|'不影响此错误,只是改输出分隔符 - 想让缺失字段输出空值?
cut做不到,得换awk -F',' '{print $2}',它对缺字段默认输出空字符串 - 调试时先用
head -5 file | cat -A看真实分隔符和控制符
和 awk、sed 比,cut 的适用边界在哪
cut 快、内存低、POSIX 兼容性好,但仅适合“分隔符干净+字段位置固定”的场景。一旦要判断、过滤、合并、处理引号或转义,它立刻掉链子。
- 纯列提取且分隔符统一 → 用
cut,比awk快 20%~30% - 含标题行需条件过滤 → 改用
awk 'NR>1 {print $3}' - 字段里有换行或嵌套逗号 → 必须上
csvkit或 Pythoncsv模块 - Mac 上
cut不支持-z(null 分隔),Linux 可用find ... -print0 | cut -z -f1处理含空格路径
实际用的时候,别硬套 cut。看到字段不对齐、分隔符不一致、或者输出突然变少,八成是它在静默丢行——这时候看一眼 head -n3 file 和 cat -A 输出,比查手册快。










