分享

awk进阶案例

本帖最后由 sky_mld 于 2025-2-24 17:01 编辑

awk 是一个强大的文本处理工具,适合处理结构化数据和生成报表。以下是一些进阶案例,涵盖复杂文本处理、数据统计和脚本编写技巧:

案例 1:统计 Apache 日志中的 IP 访问次数
目标:从 Apache 日志中统计每个 IP 的访问次数,并按访问量降序输出。
日志格式示例:
192.168.1.1 - - [10/Jul/2023:14:55:36 +0800] "GET /index.html HTTP/1.1" 200 2326
192.168.1.2 - - [10/Jul/2023:14:55:37 +0800] "GET /about.html HTTP/1.1" 404 1234

命令:
awk '{ ip_count[$1]++ } END { for (ip in ip_count) print ip, ip_count[ip] }' access.log | sort -nrk2

输出:
192.168.1.1 100
192.168.1.2 50

关键点:
  • 使用数组 ip_count 统计 IP 出现次数。
  • END 块遍历数组并输出结果。
  • 结合 sort -nrk2 按访问量降序排序。



案例 2:计算学生成绩的平均分与标准差
目标:从 CSV 文件中计算每个学生的平均分和标准差。
数据文件 scores.csv:
Name,Math,Physics,Chemistry
Alice,90,85,88
Bob,78,92,80
Carol,95,89,93

脚本:
awk -F',' 'NR == 1 { next }  # 跳过标题行
  {    sum = 0    for (i=2; i<=NF; i++) sum += $i   
       avg = sum / (NF-1)   
       sumsq = 0   
       for (i=2; i<=NF; i++) sumsq += ($i - avg)^2   
       stddev = sqrt(sumsq / (NF-1))   
       printf "%s: 平均分=%.2f, 标准差=%.2f\n", $1, avg, stddev}' scores.csv

输出:
Alice: 平均分=87.67, 标准差=2.05
Bob: 平均分=83.33, 标准差=6.11
Carol: 平均分=92.33, 标准差=2.49

关键点:
  • 使用循环遍历字段计算总和与平方差。
  • 利用 sqrt 函数计算标准差。
  • 跳过标题行 (NR == 1)。


案例 3:处理多行记录(如邮件日志)
目标:从多行邮件日志中提取发件人和主题。
日志格式:
Message-ID: 123
From: alice@example.com
To: bob@example.com
Subject: Meeting
Date: 2023-07-10

Message-ID: 456
From: carol@example.com
To: dave@example.com
Subject: Project Update
Date: 2023-07-11

脚本:
awk 'BEGIN { RS = ""; FS = "\n" }  # 按空行分割记录,字段按行分割
{    from = ""   
     subject = [/*][/*][/*][/*][/*][/*][/*][/ip][/$1]

试读已结束,请付费阅读全文。

  本文只能试读34%,付费后可阅读全文。 

版权说明:论坛帖子主题均由合作第三方提供并上传,若内容存在侵权,请进行举报

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系在线客服