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

awk命令

Shell Awk 命令详解:从理论到实战

概述

AWK 是一种强大的文本处理语言,专门用于文本分析和数据提取。它诞生于 20 世纪 70 年代的贝尔实验室,名称来源于其三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。

AWK 主要用于扫描、过滤、统计和汇总文本数据,支持从标准输入、管道或文件中读取数据。在 Linux 系统中,常用的版本是 GAWK(GNU AWK),它是 AWK 的自由软件版本,完全兼容原有的 AWK 和 NAWK。

which awk
# 输出:/usr/bin/awk
ll `which awk`
# 输出:lrwxrwxrwx. 1 root root 4 8月  19 2022 /usr/bin/awk -> gawk

工作原理

AWK 逐行读取文本,默认以空格或制表符作为分隔符,将每行分割成多个字段,并保存到内置变量中。用户可以通过定义模式和动作来处理这些字段。

与 sed 不同,AWK 更侧重于对字段的处理,而 sed 更适合整行处理。AWK 支持逻辑运算和数学运算,能进行复杂的文本处理任务。

工作流程

AWK 程序由三个部分组成:

  • BEGIN 块:在处理输入前执行,用于初始化操作。
  • 主体块:对每一行输入数据执行指定的动作。
  • END 块:在处理完所有输入后执行,用于汇总结果。
    在这里插入图片描述

执行流程

  1. 读(Read):读取一行数据。
  2. 执行(Execute):根据模式匹配执行相应动作。
  3. 重复(Repeat):重复上述过程直到文件结束。
    在这里插入图片描述

基本语法

在这里插入图片描述

命令格式

awk [选项] '模式或条件{动作}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ...

常用内置变量

  • FS:输入字段分隔符(默认空格或制表符)
  • OFS:输出字段分隔符(默认空格)
  • NF:当前行的字段数
  • NR:当前行号
  • FNR:各文件分别计数的行号
  • $0:当前行的完整内容
  • $n:当前行的第 n 个字段
  • FILENAME:当前处理的文件名
  • RS:输入记录分隔符(默认换行符)
  • ORS:输出记录分隔符(默认换行符)

实战案例

基础文本处理

# 打印文件内容
awk '{print}' zz# 指定冒号为分隔符并打印第5列
awk -F: '{print $5}' zz# 使用多个分隔符
awk -F[:/] '{print $9}' zz

内置变量使用

# 打印行号和内容
awk -F: '{print NR, $0}' /etc/passwd# 打印总行数
awk 'END{print NR}' /etc/passwd# 打印最后一列
awk -F: '{print $NF}' /etc/passwd

模式匹配

# 匹配包含root的行
awk -F: '/root/' /etc/passwd# 精确匹配第一列为root的行
awk -F: '$1=="root"' /etc/passwd# 匹配第三列大于等于1000的行
awk -F: '$3>=1000' /etc/passwd

逻辑运算

# 使用&&和||组合条件
awk -F: '$3<10 || $3>=1000' /etc/passwd
awk -F: 'NR>4 && NR<10' /etc/passwd

BEGIN和END块

# 初始化变量并计算
awk 'BEGIN{x=10;print x+1}'# 统计以/bin/bash结尾的行数
awk 'BEGIN{x=0};/\/bin\/bash$/{x++;print x,$0};END{print x}' /etc/passwd

高级功能

# if条件语句
awk -F: '{if($3<10){print $0}}' /etc/passwd# 数组使用
awk 'BEGIN{a[0]=10;a[1]=20;print a[1]}'# for循环遍历数组
awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print i,a[i]}}'

生产环境应用

# 提取IP地址
ifconfig ens33 | awk '/netmask/{print "本机IP地址是:"$2}'# 统计内存使用百分比
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'# 统计日志中每个IP的出现次数
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log | sort -r

总结

  • grep/egrep:更适合单纯的文本查找和匹配
  • sed:更适合对匹配到的文本进行编辑操作
  • awk:更适合格式化文本和对文本进行复杂处理

AWK 是一个功能强大的文本处理工具,掌握了它的基本用法和高级特性,能够极大地提高文本处理和数据提取的效率。无论是简单的字段提取还是复杂的数据统计,AWK 都能提供优雅的解决方案。


本文介绍了 AWK 的基本概念、工作原理和实战应用,希望对你的文本处理工作有所帮助。如有任何疑问或建议,欢迎留言讨论。

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

相关文章:

  • GitHub 上那些值得收藏的英文书籍推荐(计算机 非计算机类)
  • 逻辑回归:从原理到实战的完整指南
  • 刻意练习理论
  • 群晖为家纺企业 500 名员工打造企业网盘,赋能家纺制造效率飞跃
  • Python数据分析与处理(二):将数据写回.mat文件的不同方法【超详细】
  • 第二章 Windows 核心概念通俗解析
  • Linux 的 swap 是什么
  • Vue3 警告:Runtime directive used on component with non-element root node 解决方案
  • 16k+ star! 只需要DDL就能一键生成数据库关系图!
  • 正运动控制卡学习-网络连接
  • Java 黑马程序员(进阶篇1)
  • 从BERT到RoBERTa、ALBERT:揭秘Encoder-only预训练模型的进化之路
  • 【常用SQL语句和语法总结】
  • 数据科学家如何更好地展示自己的能力
  • 项目中 Spring Boot 配置文件未生效该如何解决
  • JavaScript箭头函数与普通函数:两种工作方式的深度解析
  • 诊断服务器(Diagnostic Server)
  • Linux 字符设备驱动框架学习记录(三)
  • Spring Boot 全局异常处理问题分析与解决方案
  • PastePal for Mac 剪贴板历史记录管理器
  • prometheus+grafana搭建
  • 7.4Element Plus 分页与表格组件
  • js设计模式-装饰器模式
  • CI(持续集成)、CD(持续交付/部署)、CT(持续测试)、CICD、CICT
  • Few-Shot Prompting 实战:用5个例子让GPT-4学会复杂任务
  • (二)文件管理-基础命令-cd命令的使用
  • 中州养老:资源添加功能
  • gitlab推送失败,内存不足的处理
  • 深入浅出Spring IoC与DI:设计思想、实现方式与反射技术详解
  • Excel 电影名匹配图片路径教程:自动查找并写入系统全路径