首页/系统/Linux 运维命令速查/cut 按列剪切文本
文本处理77 条

cut 按列剪切文本

按分隔符取字段(-d -f)或按字符位置取(-c),轻量列提取工具;规则简单是优点也是局限。

Linux 运维命令速查系统更新于 2026-10-13

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 才可靠。

易错点

  • 忘写 -d 时默认按 TAB 切分,空格分隔的数据会让 -f2 输出整行,看着像命令没生效
  • -d 只接受单个字符,写成 -d '::' 会被当作两个字符处理,结果与预期不符
  • 分隔符是 shell 元字符时要加引号:cut -d. 在部分 shell 下会被展开或吞掉
  • 中文文本用 -c 切分要确认 locale 是 UTF-8,否则按字节切可能截断汉字产生乱码

数据来源与参考

  • man 1 cut(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌