awk命令详解以及结合grep与sed的应用

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

二、综合练习题(结合 grepsed 和 awk

练习题1:分析日志文件

任务:处理日志文件 app.log,要求:

  1. 提取所有包含 ERROR 的行,保存到 errors.log

  2. 将这些行中的时间格式从 2023-10-01 改为 01/10/2023

  3. 统计每个错误类型(如 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 文件(格式:产品名,单价,销量):

  1. 删除所有空行和注释行(以 # 开头)。

  2. 将单价从美元 $10 格式改为纯数字 10

  3. 计算每个产品的总销售额(单价 × 销量),并输出总销售额最高的产品。

解答

# 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 输出,要求:

  1. 过滤出当前用户(假设为 ubuntu)的进程。

  2. 提取进程的 PIDCPU% 和 命令

  3. 输出 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:结构化处理列数据(如计算、统计、条件过滤)。

组合使用场景

  1. 日志分析grep 过滤关键行 → sed 清洗数据 → awk 统计。

  2. 数据报表sed 删除无用行 → awk 计算并格式化输出。

  3. 系统监控ps/top 输出 → grep 筛选进程 → awk 提取指标。

掌握这三个工具的组合使用,可以高效解决日常文本处理任务!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大小小聪明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值