Shell脚本-cut工具
一、前言
在 Linux/Unix 系统中,cut
是一个非常实用的文本处理命令,用于从文件或标准输入中提取特定列的内容。它特别适用于处理结构化文本数据,例如 CSV 文件、日志文件、配置文件等。
无论是做数据分析、系统监控,还是编写自动化脚本,cut
都是一个不可或缺的工具。
本文将带你全面了解 cut
工具的使用方式,包括:
✅ cut
的基本语法与常用参数
✅ 如何按字符、字节、字段进行提取
✅ cut
在 Shell 脚本中的实战应用
✅ 与其他文本处理命令的联合使用
✅ 实际开发中的常见问题与优化建议
并通过完整的代码示例帮助你快速上手并熟练掌握 cut
的各种高级用法。
二、什么是 cut?
cut
是一个用于 切割文本列 的命令行工具,它可以按照指定的分隔符或固定位置提取数据。
✅ 典型用途包括:
场景 | 示例 |
---|---|
提取用户名 | 从 /etc/passwd 提取用户列表 |
日志分析 | 提取访问日志中的 IP 地址、请求路径 |
数据清洗 | 从 CSV 文件中提取某几列数据 |
自动化脚本 | 快速提取变量值、过滤冗余信息 |
三、cut 基础语法
cut [选项] 文件名
✅ 常用选项说明:
参数 | 描述 |
---|---|
-b | 按字节提取(byte-based) |
-c | 按字符提取(character-based) |
-f | 按字段提取(field-based),默认以制表符 \t 分隔 |
-d | 指定字段分隔符(delimiter) |
--output-delimiter=STR | 设置输出时使用的分隔符 |
-s | 不输出没有分隔符的行(静默模式) |
四、cut 使用示例
✅ 示例1:按字符提取(-c
)
echo "Hello World" | cut -c1-5
输出:
Hello
💡
-c1-5
表示提取第 1 到第 5 个字符。
✅ 示例2:按字段提取(-f
+ -d
)
假设有一个 CSV 文件 data.csv
内容如下:
name,age,city
Alice,28,Beijing
Bob,32,Shanghai
Charlie,25,Guangzhou
提取第二列(年龄):
cut -d',' -f2 data.csv
输出:
age
28
32
25
✅ 示例3:修改输出分隔符(--output-delimiter
)
cut -d',' -f1,3 data.csv --output-delimiter=' | '
输出:
name | city
Alice | Beijing
Bob | Shanghai
Charlie | Guangzhou
✅ 示例4:只提取有分隔符的行(-s
)
echo "This line has no delimiter" > test.txt
echo "name:age:city" >> test.txtcut -d':' -f1 -s test.txt
输出:
name
💡 只输出包含分隔符
:
的行。
五、cut 在 Shell 脚本中的应用
✅ 示例1:提取 IP 地址(结合 hostname
)
ip=$(hostname -I | cut -d' ' -f1)
echo "当前主机IP为:$ip"
✅ 示例2:解析环境变量配置文件
假设 config.env
内容如下:
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
提取所有键名:
grep '=' config.env | cut -d'=' -f1
输出:
DB_HOST
DB_PORT
DB_USER
✅ 示例3:获取 CPU 型号名称(结合 lscpu
)
lscpu | grep 'Model name' | cut -d':' -f2 | sed 's/^ *//;s/ *$//'
输出类似:
Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
六、cut 与其他命令的配合使用
✅ 示例1:提取日志中的 URL 并排序去重(cut
+ sort
+ uniq
)
cat access.log | cut -d'"' -f2 | cut -d' ' -f2 | sort | uniq
输出访问过的唯一 URL。
✅ 示例2:统计访问次数最多的 IP(cut
+ grep
+ awk
)
grep 'GET /index.html' access.log | cut -d' ' -f1 | sort | uniq -c | sort -nr | head -n 10
输出访问
/index.html
最频繁的前 10 个 IP。
七、cut 使用技巧总结
技巧 | 说明 |
---|---|
✅ 使用 -f 提取字段 | 适用于 CSV、TSV 等格式的数据 |
✅ 使用 -d 自定义分隔符 | 支持任意字符作为分隔符 |
✅ 使用 -c 提取固定位置字符 | 适用于格式固定的文本 |
✅ 使用 -b 提取字节范围 | 处理非 UTF-8 编码文件时有用 |
✅ 使用 --output-delimiter 修改输出格式 | 控制输出样式更灵活 |
✅ 结合 grep 过滤后再提取 | 减少无效数据干扰 |
✅ 与 sort 、uniq 、awk 联合使用 | 实现复杂文本处理逻辑 |
八、cut 实战案例汇总
✅ 案例1:从 /etc/passwd
提取用户名
cut -d':' -f1 /etc/passwd
输出系统中所有用户名。
✅ 案例2:提取 HTTP 请求状态码(access.log)
cut -d'"' -f3 access.log | cut -d' ' -f2
提取每次请求的状态码(如 200、404)。
✅ 案例3:提取邮件地址中的域名部分
echo "user@example.com" | cut -d'@' -f2
输出:
example.com
九、常见问题与解决方法
问题 | 原因 | 解决方案 |
---|---|---|
无法提取正确字段 | 分隔符设置错误 | 检查 -d 参数是否匹配实际分隔符 |
输出为空 | 字段索引超出范围 | 使用 -f1-3 或检查字段是否存在 |
多个空格导致误判 | 分隔符不统一 | 使用 tr 或 awk 预处理 |
输出中文乱码 | 编码不一致 | 使用 iconv 转换编码或检查终端设置 |
cut 不支持正则表达式 | 功能有限 | 使用 awk 或 perl 替代 |
十、总结对比表:cut 常用参数一览
参数 | 功能 |
---|---|
-b | 按字节提取 |
-c | 按字符提取 |
-f | 按字段提取 |
-d | 自定义字段分隔符 |
--output-delimiter | 设置输出分隔符 |
-s | 静默模式,仅输出有效行 |
十一、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!