当前位置: 首页 > news >正文

Shell三剑客之awk

目录

一、awk的由来

二、awk的工作原理

三、awk的基本使用方法

1. 命令行语法

 2. 基本语法结构

3. 内置变量

4. 流程控制

四、实战案例

案例1:提取特定列

案例2:条件过滤

案例3:统计与计算

案例4:字符串操作

案例5:数组应用

五、总结


一、awk的由来

1977年,贝尔实验室的 Alfred AhoPeter Weinberger 和 Brian Kernighan 共同开发了 awk 工具。其名称来源于三位开发者姓氏的首字母组合(Aho + Weinberger + Kernighan)。awk 的诞生是为了弥补 grep 和 sed 在处理结构化文本时的不足,提供一种更强大的文本分析和数据处理能力。如今,awk 已成为 Linux/Unix 系统中文本处理的标配工具之一。

二、awk的工作原理

awk 的核心设计思想是 逐行处理文本,其工作流程分为以下步骤:
  1. 读取输入:按行读取文件或标准输入。

  2. 分割记录:将每行按指定的分隔符(默认为空格或制表符)分割成多个字段($1, $2, ..., $n)。

  3. 模式匹配:检查当前行是否匹配预设的“模式”(如正则表达式或条件判断)。

  4. 执行动作:若匹配成功,则执行对应的“动作”(如打印、计算等)。

  5. 循环处理:重复上述过程直到所有行处理完毕。

特殊处理块

  • BEGIN{}:在处理任何行之前执行。

  • END{}:在处理所有行之后执行。

三、awk的基本使用方法

1. 命令行语法

awk [选项] '模式 {动作}' 文件名

常用选项

  • -F:指定字段分隔符(如 -F':' 表示以冒号分隔)。

  • -v:定义变量(如 -v var=value)。

 2. 基本语法结构

# 格式
模式 {动作1;动作2;...
}# 示例:打印包含"error"的行
awk '/error/ {print $0}' log.txt

3. 内置变量

变量描述示例
FS输入字段分隔符BEGIN{FS=":"}
OFS输出字段分隔符BEGIN{OFS="-"}
NR当前处理的行号{print NR, $0}
NF当前行的字段数量{print $NF}(最后一列)
$0整行内容{print $0}
$1第一个字段{print $1}

4. 流程控制

支持 ifforwhile 等结构:

# 示例:计算1~5的平方
awk 'BEGIN{for(i=1; i<=5; i++) print i, i*i}'

四、实战案例

案例1:提取特定列

目标:从 /etc/passwd 中提取用户名(第1列)和Shell类型(第7列)。

awk -F':' '{print $1, $7}' /etc/passwd
# 输出示例:
# root /bin/bash
# daemon /usr/sbin/nologin

案例2:条件过滤

目标:筛选出内存占用超过100MB的进程。

ps aux | awk '$6 > 100*1024 {print $11, $6/1024 "MB"}'
# $6为RSS(内存占用,单位KB),$11为进程名

案例3:统计与计算

目标:统计日志文件中各HTTP状态码出现的次数。

awk '{status[$9]++} END{for(code in status) print code, status[code]}' access.log
# 输出示例:
# 200 3521
# 404 23
# 500 5

案例4:字符串操作

目标:将逗号分隔的CSV文件转换为竖线分隔。

awk 'BEGIN{FS=","; OFS="|"} {$1=$1; print}' data.csv
# $1=$1 用于强制重新格式化输出

案例5:数组应用

目标:计算学生成绩的平均分。

# 输入文件 grades.txt:
# Alice 85 90 78
# Bob 72 88 95
awk '{sum=0; for(i=2; i<=NF; i++) sum+=$i; avg=sum/(NF-1); print $1, avg}' grades.txt
# 输出示例:
# Alice 84.3333
# Bob 85

五、总结

awk 凭借其灵活的字段处理、模式匹配和编程能力,成为文本处理领域的“瑞士军刀”。无论是日志分析、数据清洗,还是快速计算,awk 都能以极简的代码高效完成任务。结合 grep 和 sed,三者共同构成Shell脚本中不可或缺的文本处理工具链。

通过掌握 awk 的核心语法和内置变量,用户可以在日常工作中大幅提升数据处理效率。尝试用 awk 替代繁琐的手动操作,体验命令行艺术的魅力吧!

http://www.xdnf.cn/news/627679.html

相关文章:

  • 全球化 2.0 | 云轴科技ZStack助力中东智慧城市高性能智能安防云平台
  • TypeScript小技巧使用as const:让类型推断更精准。
  • exti line2 interrupt 如何写中断回调
  • 数据库中表的设计规范
  • 【软考】【信息系统项目管理师】2025年5月24日考试回忆版,祝明天考试的兄弟们顺利
  • maxkey单点登录系统
  • Neo4j(二) - 使用Cypher操作Neo4j
  • iOS 直播特殊礼物特效实现方案(Swift实现,超详细!)
  • STM32F446主时钟失效时DAC输出异常现象解析与解决方案
  • AtCoder AT_abc407_d [ABC407D] Domino Covering XOR
  • 【Web前端】jQuery入门与基础(二)
  • 免费PDF工具-PDF24V9.16.0【win7专用版】
  • TypeScript基础数据类型详解总结
  • 常见的图像生成模型
  • 嵌入式开发学习日志(linux系统编程--进程(1))Day27
  • winsever2016Web服务器平台安装与配置
  • python训练营day34
  • TIT-2014《Randomized Dimensionality Reduction for $k$-means Clustering》
  • 第十天的尝试
  • 快速排序算法的C++和C语言对比
  • Python实用工具:文件批量重命名器
  • Unity3D仿星露谷物语开发49之创建云杉树
  • 常见算法题目3 -反转字符串
  • 2025年—ComfyUI_最新插件推荐及使用(实时更新)
  • 保姆式一步一步制作B端左侧菜单栏
  • 游园安排--最长上升子序列+输出序列
  • 力扣:《螺旋矩阵》系列题目
  • Vant4+Vue3+Vite开发搭建教程
  • 【Redis】分布式缓存的一系列问题(持久化,主从集群,哨兵,分片集群)
  • 解决Docker容器内yum: not found、apt: not found、apk: command not found等命令找不到问题