一、引言
在软件开发、测试及运维中,文本处理无处不在。从日志解析、数据清洗,到配置文件批量修改,文本处理的效率直接影响工作效率和质量。在Unix/Linux世界里,cut
、awk
、sed
三个工具,被称为“文本处理三剑客”,各自具备强大功能,也能协同发挥无穷威力。
本篇文章将基于实际应用场景,深度剖析三者的高阶用法,解读背后的原理与设计思路,帮助你迈入文本处理高手之列。
二、cut
cut
是一个快速且高效的命令,专注于按列或字符截取文本。它非常适合处理结构简单的定界文本文件。
示例:
1. 按多列抽取,保持列顺序灵活
cut -d ',' -f 3,1,5 data.csv
-
使用逗号分隔符,提取第3、第1和第5列
-
输出列顺序按参数顺序排列,灵活调整字段顺序
2. 结合管道过滤并提取字段
ps aux | grep java | grep -v grep | cut -d ' ' -f 1,2,11
-
先过滤进程,再提取用户、PID、命令字段
Tips:
cut
以固定分隔符为前提,适合字段清晰的文本,复杂格式推荐使用awk
。
三、awk
awk
不仅是命令,更是一门迷你编程语言。它以行为单位,按字段分割,可执行复杂逻辑,支持变量、条件、循环等。
示例:
1. 计算文件中某列的加权平均值
假设grades.txt
内容如下:
Alice 85 0.3
Bob 90 0.4
Carol 75 0.3
计算加权平均:
awk '{sum += $2 * $3; wsum += $3} END {print "Weighted Average:", sum/wsum}' grades.txt
-
$2
为成绩,$3
为权重 -
END
块在处理完所有行后输出结果
2. 按字段排序并输出格式化表格
awk '{print $2, $1}' users.txt | sort -nr | awk '{printf "%-10s %s\n", $2, $1}'
-
交换字段,排序(数值降序)
-
格式化输出列宽
3. 多条件过滤
awk '$3 > 80 && $4 == "Passed" {print $1, $3}' results.txt
-
只输出分数大于80且状态为Passed的姓名和分数
4. 正则匹配字段内容
awk '$0 ~ /ERROR|WARN/ {print NR, $0}' logfile.log
-
输出包含“ERROR”或“WARN”的行号及内容
四、sed
sed
主要用于行文本替换、删除、插入及复杂流编辑,善于批量自动化改写。
示例:
1. 批量替换多文件中的配置项
将配置文件中所有timeout=30
改为timeout=60
:
sed -i 's/timeout=30/timeout=60/g' *.conf
-
-i
原地替换 -
g
全局替换行内所有匹配
2. 删除日志中某时间段记录
假设日志中每行以时间戳开头,格式YYYY-MM-DD HH:MM:SS
,删除10点到11点的记录:
sed '/^2025-06-26 10:/d' app.log
3. 多行模式编辑——合并多行
将以反斜杠\
结尾的行与下一行合并:
sed ':a; /\\$/ { N; s/\\\n//; ba }' file.txt
-
:a
定义标签,ba
跳转循环,反复处理多行合并
4. 插入行
在匹配模式前插入一行:
sed '/^ERROR/i\### ERROR DETECTED ###' app.log
五、三剑客组协同发挥更大威力
示例:提取 nginx 访问日志中状态码为 500 的 IP 列表
grep " 500 " access.log | awk '{print $1}' | sort | uniq -c | sort -nr
-
grep
快速过滤 -
awk
抽取第一列(IP) -
sort | uniq -c
统计频率 -
结果按访问次数降序
示例:批量替换日志中日期格式
sed -r 's/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/\1-\2-\3/g' logfile.log | cut -d ' ' -f 1-5
-
sed
将YYYY/MM/DD
格式改为YYYY-MM-DD
-
cut
提取前五字段简化输出
六、实用技巧与性能优化建议
-
避免使用过多管道,复杂逻辑优先用
awk
实现,减少进程创建开销。 -
使用
sed -r
或awk
的扩展正则,提高匹配效率。 -
文本量巨大时,使用
LC_ALL=C
环境变量提高处理速度。 -
结合
xargs
或parallel
并行处理多个文件,提升吞吐。 -
充分利用
awk
的变量和条件判断,实现智能文本分析。
七、总结
cut
、awk
、sed
作为经典文本处理工具,各有千秋。它们从简洁的字段提取,到复杂的文本替换与逻辑判断,构成了Unix文本处理的坚实基石。
-
cut
:轻量快速,适合定界简单字段抽取 -
awk
:逻辑强大,适合复杂计算与条件过滤 -
sed
:文本流编辑,擅长自动化替换与批量修改
掌握它们的高阶用法,能显著提升文本数据的处理效率和质量,使你在开发、测试、运维乃至数据分析中如虎添翼。