1. 为什么要单独聊聊 cut:它到底解决什么问题
1.1 列提取是最常见的文本处理需求
Linux 下面处理文本,绕不开三件事:查找、替换、提取。查找有 grep,替换有 sed,而提取列这件事,大家第一反应往往是 awk。但 awk 功能太强,有时候反而“杀鸡用牛刀”。如果你只是想把 /etc/passwd 里每行的用户名取出来,或者把日志里第 2 列、第 3 列单独拎出来,cut 其实是最直接、最轻量的选择。
我最早接触 cut 是在看别人写的部署脚本时,发现有人用 cut -d: -f1 /etc/passwd 来循环遍历系统用户。当时第一反应是这命令怎么这么安静,不声不响就把列给切了。后来自己排查日志、写自动化脚本时,cut 的使用频率越来越高,因为它够简单、够快,而且行为非常可预期。
cut 能做什么?简单说就是按“分隔符”或者按“字符/字节位置”把每一行切开,然后输出你想要的那几段。它不会像 awk 那样帮你做模式匹配、计算、格式化输出,它就老老实实切列。这种“单一职责”恰恰是它在脚本里最受欢迎的原因:你不需要考虑额外的语法开销,写出来就是很干净的管道命令。
1.2 cut 和 awk、sed 的分工区别
很多新手容易把 cut、awk、sed 搞混,因为看起来都能处理“行里的某个部分”。我个人的理解方式是这样的:
- sed 擅长“行编辑”,核心是替换、删除、插入,方向是“改”。
- awk 擅长“结构化分析”,核心是字段、模式、计算,方向是“算”。
- cut 擅长“简单裁剪”,核心就是按分隔符或固定位置把列切出来,方向是“取”。
所以如果只是“取出某一列”,用 awk 当然也行,但 awk 的字段默认按空白切分,遇到多空格、tab 混排时行为需要额外调试;而 cut 的 -d 明确指定分隔符,不会有那么多“惊喜”。反过来,如果你需要对字段做累加、求最大值、按条件过滤后再输出,那 awk 才是对的选择,cut 这时候就不够用了。
这不是说谁比谁高级,而是不同工具对应不同场景。我用 cut 的时候特别多,但它从来不是唯一方案,关键是要知道每个工具的边界在哪儿。下面从语法开始把 cut 完整拆开讲一遍。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. cut 命令的基础语法与核心选项
2.1 命令语法和 -f、-d、-c、-b 的含义
cut 的基本语法是:
bash复制cut OPTION... [FILE]...
如果不给文件名,默认从标准输入读。这个设计让它天生适合放在管道中间。
常用选项就这几个:
| 选项 | 含义 | 典型用法 |
|---|---|---|
-f |
field,按字段提取,配合 -d 使用 |
cut -f1,3 file |
-d |
delimiter,指定字段分隔符 | cut -d: -f1 file |
-c |
character,按字符位置提取 | cut -c1-10 file |
-b |
byte,按字节位置提取 | cut -b1-5 file |
--complement |
反向选择,输出没被选中的部分 | cut -f1 --complement file |
--output-delimiter |
指定输出时使用的分隔符 | cut -d: -f1,3 --output-delimiter='-' file |
-f 和 -d 是一对搭档:-d 告诉 cut 用什么符号把一行拆成多列,-f 告诉它要哪些列。默认的 -d 是制表符 TAB。所以如果你直接运行 cut -f1 file,它按 tab 切列,而不是按空格切列。这个默认行为经常让人踩坑,后面会细说。
-c 和 -b 的区别在于单位:-c 按字符,-b 按字节。对纯 ASCII 文本来说二者看起来一样;但遇到中文这类多字节字符时就有说法了。在 UTF-8 环境下,一个汉字通常占 3 个字节,cut -c 按字符切是安全的,cut -b 按字节切可能会把一个汉字劈成两半,输出乱码。所以处理中文文本时优先考虑 -c。
2.2 范围写法规则:n、n-、n-m、-m 的差别
不管是 -f、-c 还是 -b,后面的列表都支持同一种范围语法。这个语法看着简单,但经常有人写错:
| 写法 | 含义 |
|---|---|
1 |
只取第 1 列/字符 |
1,3 |
取第 1 和第 3 列/字符 |
1-3 |
取第 1 到第 3 列/字符(闭区间) |
1- |
从第 1 列/字符到行尾 |
-3 |
从行首到第 3 列/字符,等价于 1-3 |
| `1-3 |
