awk
是 Linux 中强大的文本处理工具,擅长基于列的文本分析和处理。以下是 awk
的详细用法、示例,以及结合 grep
和 sed
的实际应用。
一、awk
命令详解
1. 基本语法
awk '模式 {动作}' 文件名
-
模式:筛选条件(如正则、行号、列值比较)。
-
动作:对匹配的行执行的操作(如打印、计算)。
2. 常用示例
示例1:打印指定列
# 打印文件第1列和第3列(默认以空格/Tab分隔) awk '{print $1, $3}' file.txt # 打印第2列,并在行首添加行号 awk '{print NR, $2}' file.txt
-
NR
:当前行号。 -
$0
:整行内容,$1
、$2
等表示第1、2列。
示例2:指定列分隔符
# 处理以逗号分隔的 CSV 文件(如:name,age,city) awk -F',' '{print $2}' data.csv # 输出时用 "---" 连接列 awk -F',' '{OFS="---"; print $1, $3}' data.csv
-
-F','
:设置输入分隔符为逗号。 -
OFS
:设置输出分隔符。
示例3:条件过滤
# 打印第2列大于30的行 awk '$2 > 30 {print $0}' data.txt # 打印包含 "error" 的行 awk '/error/ {print}' log.txt # 打印第5行到第10行 awk 'NR>=5 && NR<=10 {print}' file.txt
示例4:计算统计
# 计算第3列的总和 awk '{sum += $3} END {print "总和:", sum}' data.txt # 统计文件行数 awk 'END {print NR}' file.txt # 计算第2列的平均值 awk '{sum += $2; count++} END {print "平均值:", sum/count}' data.txt
示例5:修改列内容
# 将第2列的值乘以2后输出 awk '{$2 = $2 * 2; print}' data.txt # 在第1列前添加前缀 "ID:" awk '{$1 = "ID:" $1; print}' data.txt
二、综合练习题(结合 grep
、sed
和 awk
)
练习题1:分析日志文件
任务:处理日志文件 app.log
,要求:
-
提取所有包含
ERROR
的行,保存到errors.log
。 -
将这些行中的时间格式从
2023-10-01
改为01/10/2023
。 -
统计每个错误类型(如
ERROR: Disk Full
)的出现次数。
解答:
# 1. 提取 ERROR 行 grep "ERROR" app.log > errors.log # 2. 修改时间格式(假设时间在第1列) sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' errors.log > errors_fixed.log # 3. 统计错误类型(假设错误信息在第4列后) awk -F':' '{err[$4]++} END {for (e in err) print e, "次数:", err[e]}' errors_fixed.log
练习题2:处理 CSV 数据
任务:处理 sales.csv
文件(格式:产品名,单价,销量
):
-
删除所有空行和注释行(以
#
开头)。 -
将单价从美元
$10
格式改为纯数字10
。 -
计算每个产品的总销售额(单价 × 销量),并输出总销售额最高的产品。
解答:
# 1. 删除空行和注释行 sed '/^#/d; /^$/d' sales.csv > cleaned.csv # 2. 移除单价中的 $ 符号 sed -i 's/\$//g' cleaned.csv # 3. 计算总销售额并找出最大值 awk -F',' '{total = $2 * $3; print $1, total; if (total > max) {max = total; product = $1}} END {print "最高销售额:", product, max}' cleaned.csv
练习题3:提取系统信息
任务:分析 ps aux
输出,要求:
-
过滤出当前用户(假设为
ubuntu
)的进程。 -
提取进程的
PID
、CPU%
和命令
。 -
输出 CPU 使用率超过 5% 的进程,按 CPU% 降序排序。
解答:
# 1. 过滤用户进程,提取 PID、CPU%、命令(第2、3、11列) ps aux | grep "^ubuntu" | awk '{print $2, $3, $11}' > process.txt # 2. 筛选 CPU% > 5% 并按降序排序 awk '$2 > 5 {print}' process.txt | sort -k2 -nr
三、总结
-
grep
:快速过滤文本行(如关键字、正则匹配)。 -
sed
:编辑文本(如替换、删除、插入)。 -
awk
:结构化处理列数据(如计算、统计、条件过滤)。
组合使用场景:
-
日志分析:
grep
过滤关键行 →sed
清洗数据 →awk
统计。 -
数据报表:
sed
删除无用行 →awk
计算并格式化输出。 -
系统监控:
ps
/top
输出 →grep
筛选进程 →awk
提取指标。
掌握这三个工具的组合使用,可以高效解决日常文本处理任务!