Linux 中的 cut 命令是一个简单而强大的文本处理工具,主要用于从文件或标准输入中提取指定的列、字节或字符,它的名称来源于“cut”(剪切),顾名思义,能够精准地“剪下”文本中需要的内容,常用于日志分析、数据处理和自动化脚本中,与其他文本处理工具(如 awk、sed)相比,cut 的语法更简洁,特别适合处理以特定分隔符(如制表符、逗号)分隔的列式数据。

cut 命令的基本语法
cut 命令的基本语法结构如下:
cut [选项] [文件名...]
如果不指定文件名,cut 会从标准输入中读取数据,这使其能够与其他命令通过管道()结合使用,形成灵活的数据处理流程。cat file.txt | cut -d',' -f1 会先显示 file.txt 的内容,然后通过 cut 提取以逗号分隔的第一列。
常用选项详解
cut 命令的核心功能通过选项来控制,以下是几个最常用的选项及其作用:
-f(字段/列提取)
-f 选项是 cut 最常用的功能,用于提取指定的列,它需要配合 -d(分隔符)选项使用,默认情况下,分隔符是制表符(\t)。
示例:
假设有一个文件 data.txt如下:
name,age,city
Alice,25,New York
Bob,30,Los Angeles
Charlie,22,Chicago
提取第一列(姓名):
cut -d',' -f1 data.txt
输出:
name
Alice
Bob
Charlie
提取多列(姓名和城市):
cut -d',' -f1,3 data.txt
输出:
name,city
Alice,New York
Bob,Los Angeles
Charlie,Chicago
使用范围提取(年龄和城市):

cut -d',' -f2-3 data.txt
输出:
age,city
25,New York
30,Los Angeles
22,Chicago
-d(指定分隔符)
-d 选项用于指定字段分隔符,默认情况下,cut 将制表符(\t)作为分隔符,但可以通过 -d 自定义其他字符,如逗号()、冒号()等。
示例:
处理以冒号分隔的 /etc/passwd 文件,提取用户名和 shell:
cut -d':' -f1,7 /etc/passwd
-c(字符提取)
-c 选项用于按字符位置提取数据,而非列,适用于需要固定宽度字符的场景,例如从日志中提取特定时间戳。
示例:
从字符串 "HelloWorld" 中提取前 5 个字符:
echo "HelloWorld" | cut -c1-5
输出:
Hello
-b(字节提取)
-b 选项与 -c 类似,但按字节而非字符提取,对于 ASCII 字符,两者效果相同;但对于多字节字符(如 UTF-8 编码的中文字符),-b 可能会截断字符,而 -c 会保持字符完整。
示例:
提取文件的前 10 个字节:
cut -b1-10 filename.txt
--complement(补集提取)
--complement 选项用于提取未指定的列或字符,即“反向选择”。
示例:
从 data.txt 中排除年龄列(第 2 列):

cut -d',' -f2 --complement data.txt
输出:
name,city
Alice,New York
Bob,Los Angeles
Charlie,Chicago
cut 命令的适用场景与局限性
适用场景
- 日志分析:从服务器日志中提取特定字段,如 IP 地址、时间戳或状态码。
示例:tail -f access.log | cut -d' ' -f1(提取每行的第一个字段,通常是 IP 地址)。 - CSV/TSV 数据处理:快速提取表格数据的列,无需加载到电子表格软件。
- 系统配置文件解析:如从
/etc/passwd或/etc/group中提取用户或组信息。
局限性
- 不支持多字符分隔符:
-d选项只能指定单个字符,无法处理类似 或\t\t这样的多字符分隔符,此时需使用awk或sed。 - 无法处理复杂逻辑:
cut只能按列、字符或字节提取,无法进行条件判断(如提取年龄大于 25 的用户),这类任务更适合awk。 - 对非固定宽度数据支持有限:如果列之间的分隔符不统一(如空格和制表符混用),
cut可能无法正确分割。
cut 与其他工具的对比
| 工具 | 主要功能 | 适用场景 | 示例 |
|---|---|---|---|
cut |
按列、字符或字节提取 | 简单列提取、固定宽度数据 | cut -d',' -f1 file.csv |
awk |
支持复杂逻辑、多字符分隔符、计算 | 条件过滤、格式化、多列处理 | awk -F',' '$2>25 {print $1}' |
sed |
文本替换、删除、插入 | 行编辑、模式匹配 | sed 's/old/new/g' file.txt |
实践案例:处理 Web 服务器日志
假设有一个 Nginx 访问日志 access.log,格式如下:
168.1.100 - - [10/Oct/2023:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1024 "https://example.com" "Mozilla/5.0"
目标:提取 IP 地址、请求路径和状态码。
步骤:
-
分隔符为空格,但方括号内的时间戳包含空格,需先处理:
cut -d'"' -f2 access.log | cut -d' ' -f1,2,3
输出:
GET /index.html HTTP/1.1 -
更高效的方式是结合
awk,但若仅用cut,可先替换时间戳中的空格:sed 's/\[.*\]/[TIME]/' access.log | cut -d' ' -f1,7,9
输出:
168.1.100 GET /index.html 200
cut 命令虽然功能相对简单,但在处理列式数据时效率极高,尤其适合快速提取、过滤或转换文本中的特定部分,通过掌握 -f、-d、-c 等核心选项,可以高效完成大多数日常文本处理任务,对于更复杂的需求,cut 可能需要与其他工具(如 awk、sed)结合使用,以发挥更大的威力,在 Linux/Unix 自动化脚本中,cut 作为一个轻量级工具,始终是文本处理工具箱中不可或缺的一员。









