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