Linux `cut` 命令深度学习详解
🐧 Linux cut 命令深度学习详解
📌 学习目标
- 理解
cut命令的基本功能及其在文本处理中的作用 - 掌握字段(field)、字符(character)和字节(byte)三种切片方式的使用方法
- 能够结合管道符、重定向等技巧,实现高效的数据提取与日志分析
🔍 核心重点
| 类型 | 选项 | 含义 | 示例 |
|---|---|---|---|
| 字段切割 | -f |
按字段分隔符分割后取指定字段 | cut -d: -f1 /etc/passwd |
| 字符切割 | -c |
按字符位置截取 | cut -c1-5 file.txt |
| 字节切割 | -b |
按字节截取(适用于单字节编码) | cut -b1-10 file.txt |
| 分隔符设置 | -d |
自定义字段分隔符(默认为 Tab) | cut -d',' -f2 file.csv |
📌 注意:
-c和-b在多字节字符(如 UTF-8 中文)中表现不同- 使用
-f时建议配合-d明确指定分隔符,避免误操作
📘 详细讲解
🧠 什么是 cut?
cut 是 Linux 下用于从每行文本中提取特定部分的命令,常用于处理结构化数据(如日志文件、CSV 文件、系统配置文件等)。它支持按字段、字符或字节进行切割,是 shell 脚本中非常常用的文本处理工具之一。
🛠️ 基本语法
cut [选项] [文件...]
最简用法示例:
cut -c1-5 file.txt
表示从 file.txt 的每一行中提取前 5 个字符。
💡 参数说明与实战用法
1. -c:按字符位置切割(Character-based)
适用于固定格式文本,例如日志时间戳、IP 地址等。
示例:
echo "Hello, Linux!" | cut -c1-5
# 输出:Hello
📌 适用场景:
- 提取日志文件中固定位置的时间信息
- 抽取 IP 地址的前缀部分
⚠️ 注意: 不适合处理多字节字符(如中文),否则会出现乱码。
2. -b:按字节位置切割(Byte-based)
更底层的操作方式,适用于二进制文件或单字节编码文本。
示例:
echo -n "你好" | cut -b1-2
# 输出:你(但实际只输出第一个字节,可能不完整)
📌 适用场景:
- 查看二进制文件头几个字节
- 处理 ASCII 编码的日志内容
⚠️ 注意: 对于 UTF-8 或其他多字节编码,一个字符可能占用多个字节,使用时需格外小心!
3. -f + -d:按字段切割(Field-based)
这是最常用也是最强大的组合方式,特别适合处理 CSV、TSV、
/etc/passwd等以特定符号分隔的结构化数据。
示例一:提取 /etc/passwd 中的用户名
cut -d: -f1 /etc/passwd
输出类似:
root
daemon
bin
sys
...
📌 适用场景:
- 提取用户列表
- 解析 CSV 表格数据
- 日志文件字段提取(如访问日志中的 IP、时间等)
示例二:提取多个字段
cut -d: -f1,6 /etc/passwd
输出用户名和家目录:
root:/root
daemon:/usr/sbin
bin:/bin
也可以指定范围:
cut -d: -f1-3 /etc/passwd
4. -s:静默模式(Suppress lines without the delimiter)
当某一行中没有分隔符时,默认会原样输出整行。加上
-s可跳过这些行。
示例:
cat data.txt
name:age:city
Tom:25:Beijing
Jerry:30
Lucy:28:Shanghai
cut -d: -f1-3 data.txt
# 输出:
# name:age:city
# Tom:25:Beijing
# Jerry:30
# Lucy:28:Shanghai
cut -s -d: -f1-3 data.txt
# 输出仅包含分隔符的行:
# name:age:city
# Tom:25:Beijing
# Lucy:28:Shanghai
📌 适用场景:
- 数据清洗时过滤无效行
- 防止脚本处理异常输入
🔄 cut 与其他命令的组合应用
经典组合一:ps + grep + cut 提取 PID
ps aux | grep sshd | grep -v grep | cut -d' ' -f2
📌 解释:
ps aux列出所有进程grep sshd找出包含 sshd 的行grep -v grep排除掉 grep 自己cut -d' ' -f2提取第二个字段(即 PID)
经典组合二:awk vs cut
虽然 awk 功能更强大,但在某些简单任务中,cut 更快更简洁:
| 命令 | 示例 | 说明 |
|---|---|---|
cut |
cut -d: -f1 /etc/passwd |
快速提取字段 |
awk |
awk -F: '{print $1}' /etc/passwd |
支持条件判断、计算等高级功能 |
📌 结论:
- 简单字段提取优先使用
cut - 复杂逻辑处理使用
awk
🧪 实战案例分析
案例一:提取 Nginx 访问日志中的 IP 地址
Nginx 默认日志格式如下:
192.168.1.100 - - [23/Jun/2025:10:00:01 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 ..."
我们可以用 cut 提取 IP:
cut -d' ' -f1 access.log
📌 输出:
192.168.1.100
192.168.1.101
192.168.1.102
案例二:从 CSV 文件中提取姓名和电话
假设有一个联系人 CSV 文件 contacts.csv,内容如下:
Name,Phone,Email
Alice,13800138000,alice@example.com
Bob,13900139000,bob@example.com
我们想提取姓名和电话:
cut -d, -f1,2 contacts.csv
📌 输出:
Name,Phone
Alice,13800138000
Bob,13900139000
案例三:提取日志中特定时间段的内容
假设你有一份按日期排序的日志文件 app.log,每行开头是日期时间:
2025-06-23 10:00:00 INFO ...
2025-06-23 10:05:00 DEBUG ...
2025-06-23 11:00:00 ERROR ...
你可以这样提取上午 10 点的日志:
grep "2025-06-23 10:" app.log | cut -c10-
📌 说明:
grep筛选时间cut -c10-删除前面的日期部分,保留后面内容
⚙️ 不同发行版注意事项
| 发行版 | 支持情况 | 备注 |
|---|---|---|
| Ubuntu | ✅ 完全支持 | 默认安装 |
| CentOS | ✅ 完全支持 | 包含于 coreutils |
| EulerOS | ✅ 完全支持 | 华为云服务器兼容良好 |
| Alpine Linux | ✅ 支持 | busybox 提供基础功能 |
| macOS | ✅ 支持 | 可通过 Homebrew 安装 |
| Windows WSL | ✅ 支持 | 所有版本均内置 |
🧪 小技巧:结合 sort, uniq 实现统计分析
提取日志中的 IP 并统计出现次数:
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr
📌 输出:
10 192.168.1.100
5 192.168.1.101
2 192.168.1.102
🧯 安全警告与建议
- 慎用
-b处理多字节编码文件:可能导致截断错误 - 字段编号从 1 开始计数:不是 0!
- 不要依赖空格作为唯一分隔符:容易因多个空格导致字段错位
- 使用
-d明确指定分隔符:提高可读性和准确性
🧰 其他相关命令推荐
| 命令 | 功能 |
|---|---|
awk |
强大的文本处理语言,支持复杂逻辑 |
sed |
流编辑器,适合替换、删除、插入操作 |
tr |
字符转换工具 |
grep |
文本搜索利器 |
paste |
合并多列文本 |
🧠 总结
cut 是 Linux 中用于快速提取文本片段的强大工具,尤其擅长处理结构化数据。无论是提取日志中的关键字段、解析 CSV 文件,还是编写自动化脚本,cut 都能帮助你实现高效的文本处理。
掌握 cut 的核心参数(-c, -b, -f, -d, -s)以及其与其他命令的组合使用,将极大提升你在运维、数据分析、日志处理等工作中的效率。
如果你已经掌握了 cut,下一步你可以深入学习:
awk:更复杂的文本处理sed:文本替换与流式编辑jq:JSON 格式数据提取(适用于 API 日志)
如需进一步了解某个具体属性或使用场景,请告诉我:
追加问题: 如何用 cut 提取日志中某一列,并去重统计?

浙公网安备 33010602011771号