cut 是什么
cut 从每行按分隔符取字段(-d 定分隔符、-f 定字段),或按字符位置取区间(-c)。它针对的是列位置固定、规则简单的文本,比如 /etc/passwd、冒号分隔的配置、定长报表,速度快、语法少,适合塞进一行命令流。局限同样是它的特点:只认单字符分隔符、不折叠连续空白、不理解引号包裹的字段,所以 CSV 带引号或多空格对齐的输出要改用 awk 或专门的解析器,否则字段会整体错位。
基本信息
| 适用平台 | Linux/macOS(GNU coreutils 与 BSD cut;GNU 下 -c 与 -b 行为一致) |
|---|---|
| 命令语法 | cut -d'分隔符' -f 字段列表 [文件] ;或 cut -c 字符区间 |
| 字段列表写法 | 2 单列、1-3 区间、1,4,7 多列、2- 第 2 列到行尾 |
| 常用选项 | -d 指定分隔符 --complement 取反 --output-delimiter 改输出分隔符 -s 丢弃不含分隔符的行 |
| 权限说明 | 只需读权限;不写文件,输出走标准输出,重定向时才受目标目录权限限制 |
典型使用场景
- 取账号字段:cut -d: -f1,3,7 /etc/passwd 快速看用户名、UID 与登录 shell
- 日志列提取:固定格式的访问日志取出客户端 IP 或状态码做后续统计
- 定长数据切分:老系统导出的定长报表按字符区间取字段
- 频次统计前置:与 sort、uniq -c 串成流水线统计某一列取值分布
- 快速裁剪 CSV:字段里不含逗号与引号时的轻量做法
常用示例
常用示例
cut -d: -f1 /etc/passwd # 用户名列表
cut -d: -f1,3,7 /etc/passwd # 多列
cut -d, -f2-4 data.csv # 第 2 到第 4 列
cut -c1-8 app.log # 每行前 8 个字符
cut -d: -f1 --complement /etc/passwd # 反选:除第 1 列以外的所有列
cut -d: -f1,3 --output-delimiter=' ' /etc/passwd # 输出改空格分隔
awk -F'[ ]+' '{print $3}' stat.txt # 多空格分隔要换 awk参数与边界
| 项 | 说明 | 坑点 |
|---|---|---|
| -d | 指定单个字符作为分隔符 | 不能写正则或多字符,-d '::' 不生效 |
| -f | 选择字段,序号从 1 开始 | 行内字段数不足时输出空字符串,不报错 |
| 缺省分隔符 | 不写 -d 时按 TAB 切分 | 空格分隔的数据会让 -f2 原样输出整行 |
| -c | 按字符位置切分 | 非 UTF-8 locale 下按字节处理,可能切坏中文 |
| --complement | 取反所选字段 | 与区间连用时要先想清「补」剩下哪些列 |
多个连续空格在 cut 眼里不是分隔符而是字段内容的一部分。要先归一化:tr -s ' ' 把连续空格压成一个,或用 awk -F'[ ]+' 显式声明。
处理含引号的 CSV(如 "Beijing, CN")时,cut 与 awk -F, 都会把引号内的逗号误当分隔符;这类数据用 python3 的 csv 模块或 csvkit 才可靠。