文本三剑客--awk

1.概述

awk是一种处理文本文件的语言,是一个强大的文本分析工具。它是专门为文本处理 设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作,数据可以来自标准输入也可以是管道或文件。

2.工作原理

  • 当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次
  • 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

3.工作流程

3.1运行模式

  • 正则表达式 : /root/ 匹配含有 root 的行
  • /*.root/
  • 关系表达式: < > && || + *
  • 匹配表达式: ~ !~ 动作:
  • 变量 命令 内置函数 流控制语句它的语法结构如下:

awk [options] 'BEGIN{ print "start" } 'pattern{ commands }' END{ print "end" }' file (其中:BEGIN END 是 AWK 的关键字部,因此必须大写;这两个部分开始块和结束块是可选的)

3.2执行流程

BEGIN 语句设置计数和打印头部信息,在任何动作之前进行

END 语句输出统计结果,在完成动作之后执行

AWK执行的流程非常简单:读(Read)执行(Execute)重复(Repeat)。下面的流程图描述出了AWK的工作流程。

4.基本语法

awk 选项' 模式或条件{操作}' 文件1 文件2 ...

awk -f 脚本文件 文件1 文件2 ..

**AWK 支持两种不同类型的变量:内建变量(可直接使用) ,自定义变量awk内置变量(预定义变量)**

如下所示:

  • FS:指定每行文本的字段分隔符,默认为空格或制表位。
  • NF:当前处理的行的字段个数。在执行过程中对应于当前的字段数,NF:列的个数
  • NR:当前处理的行的行号(序数)。 在执行过程中对应于当前的行号
  • $0:当前处理的行的整行内容。
  • n:当前处理行的第 n 个字段(第 n 列)。比如: 1 表示第一个字段,$2 表示第二个字段
  • FILENAME:被处理的文件名(当前输入文件的名)。
  • FNR 各文件分别计数的行号
  • OFS 输出字段分隔符(默认值是一个空格)
  • ORS 输出记录分隔符(默认值是一个换行符)
  • RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅读入一条记录,以进行处理。预设值是" \n' (简单来说:数据记录分隔,默认为\n,即每行为一条记录)

5.实战案例

5.1案例文本测试

1.以":"分隔/etc/passwd 用制表符作为分隔符输出打印第1第2列

2.定义多个分隔符,只要看到其中一个都算作分隔符 打印/etc/passwd第九列

5.2内建变量

awk常用内置变量:1、2、NF、NR、$0

  • $1:代表第一列
  • $2:代表第二列以此类推
  • $0:代表整行
  • NF:一行的列数
  • NR:行数

1.打印包含root的整行内容

2.打印包含root的行的第一列和第六列

3.打印每一行的列数

4.显示行号

5.3 BEGIN END运算

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END

BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次

END一般用来做汇总操作,仅在读取完数据记录之后执行一次

5.3.1 awk的运算

1.计算3*4

2.计算2的三次方

3.计算二分之一

5.3.2模糊匹配

模糊匹配,用~表示包含,!~表示不包含

1.打印第一列匹配包含有root的数据

2.模糊匹配,只要有ro就匹配打印

3.匹配第七列不以nologin结尾的,打印第一列第七列

5.3.3数值与字符串比较

比较符号:== != <= >= < >

1.打印第5行

2.打印所有第3列>1000的行

5.3.4逻辑运算

&& 和 || 是逻辑运算符,用于组合多个条件并控制程序流程。

  • && 要求所有条件都为真时才为真,否则为假
  • || 只要有一个条件为真就为真,全为假时才为假
5.3.5其他内置变量
  • FS:输入字段的分隔符 默认是空格
  • OFS:输出字段的分隔符 默认也是空格
  • FNR:读取文件的记录数(行号),从1开始,新的文件重新重1开始计数
  • RS:输入行分隔符 默认为换行符
  • ORS:输出行分隔符 默认也是为换行符

1.打印第一列

2.打印第一第二列,设置分隔符为"---"

3.读取两个文件各个行号,并打印每行

4.指定":"为换行符,进行每行打印

5.4awk高级用法 if语句

awk的if语句也分为单分支、双分支和多分支

1.打印第3列小于10的整行

2.第三列小于10的打印第三列,否则打印第一列

5.5BEGIN END 流程

awk还支持for循环、while循环、函数、数组等

1.统计以/bin/bash结尾的行数

2.输出以冒号分隔且第7个字段中包含/bash的行的第1个字段

3.输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行

4.调用wc -l命令统计使用bash 的用户个数,等同于grep -c "bash$" etc/passwd

相关推荐
大树8812 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质12 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush412 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52013 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz13 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工13 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智14 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩14 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_14 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化