命令详解 cut
cut 用于按字节、字符或字段选取每一行的一部分,适合处理结构稳定、分隔符明确的文本。它不会理解 CSV 引号、转义、可变空白或 JSON 结构;遇到这些数据应改用专用解析器、awk、jq 或 Python。
基本语法
cut OPTION... [FILE]...
三种主要选择方式互斥:
-b LIST:选择字节。-c LIST:选择字符位置;在部分实现和区域设置中与字节行为有关,复杂 Unicode 文本不要只靠位置截取。-f LIST:按字段选择,默认分隔符是制表符。
范围写法:
1 第 1 项
1,3,5 第 1、3、5 项
2-4 第 2 到第 4 项
-3 从开头到第 3 项
4- 从第 4 项到行尾
按字段提取
# /etc/passwd 中的用户名和登录 shell
cut -d: -f1,7 /etc/passwd
# 以 Tab 分隔的数据取第 2~4 列
cut -f2-4 data.tsv
# 只输出包含分隔符的行
cut -d: -s -f1 mixed.txt
-s 的含义是“不输出不含字段分隔符的行”,不是删除空行。-d 只接受单个输入分隔字符,不能直接表示正则表达式或多个连续空格。
补集与输出分隔符
# 除第 2 列之外的所有列
cut -d, --complement -f2 data.txt
# 输入用冒号,输出改为 Tab
cut -d: -f1,3 --output-delimiter=$'\t' data.txt
按字符或字节
# 每行前 8 个字符
cut -c1-8 file.txt
# 取第 1~16 个字节
cut -b1-16 binary-safe-list.txt
中文、emoji、组合字符和不同区域设置可能占多个字节或由多个码点组成。若要求按“用户看到的字符”精确切分,应使用支持 Unicode 字素簇的工具,而不是假设 -b、-c 总能得到相同结果。
常见误区
用 cut 解析 CSV
下面这行的第二个字段包含逗号:
1001,"上海,浦东",active
cut -d, -f2 不会识别双引号规则,结果会错误。应使用真正的 CSV 解析库。
用空格分隔命令输出
命令输出通常包含数量不定的空格,cut -d' ' 会产生大量空字段。可使用:
awk '{print $1, $3}' file.txt
但自动化脚本最好让源命令输出 JSON、NUL 分隔或固定列,而不是解析面向人的显示文本。
把 -n 当作行号功能
GNU cut 没有“显示行号”的 -n 用法。需要行号可使用 nl -ba file.txt,再按需求处理。
实用组合
# 从 Tab 分隔文件取列并去重
cut -f3 inventory.tsv | sort -u
# NUL 分隔文件名:先确认本机 cut 支持 -z
find . -type f -print0 | cut -z -c3-
文件名、换行符和特殊字符场景应优先使用 NUL 分隔能力,并确认管道中的每个命令都支持它。