目录

一、awk概述

二、awk 工具原理

三、awk内置变量

四、awk用法示例

1、awk常用内置变量

2、BEGIN、END的用法

3、模糊匹配

4、数值与字符串的比较

5、逻辑运算&&和||

6、其他内置变量的用法

7、awk高级用法

      定义引用变量

     awk通过管道符号、双引号调用shell命令

     查看内容百分比

     查看CPU利用率

     查看重启时间

     调用w命令,并用来统计在线用户数

 8、套用数组

五、总结


引言:awk是功能强大的编辑工具它是专门为文本处理设计的编程语言,也是处理软件,通常用于扫描、过滤、统计汇总工作,数据可以来自标准输入也可以是管道或文件。grep,sed,awk 更是Shell 编程中经常用到的文本处理工具, 被称之为Shell 编程三剑客。

一、awk概述

功能强大的编辑工具

无交互的情况下实现复杂的文本操作

命令格式

awk 选项 '模式或条件 {编辑命令}' 文件1 文件2

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

二、awk 工具原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出
如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次

逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令

sed 与awk的区别

sed命令常用于一整行的处理,而awk比较、倾向于将一行分成多个""字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。

三、awk内置变量

awk 包含几个特殊的内建变量(可直接用)如下所示:

FS 指定每行文本的字段分隔符,缺省为空格或制表位
NF 当前处理的行的字段个数
NR 当前处理的行的行号(序数)
$0 当前处理的行的整行内容
$n 当前处理行的第n个字段(第n列)

四、awk用法示例

按行输出文本

按字段输出文本

通过管道、双引号调用shell 命令

 打印文本内容

 以: 为分隔符,打印第一列

 也可以以x为分隔符,打印第一列

以冒号为分隔符,打印第1列和第3列{$1,$3}有空格效果也可以" " 也会有空格 

定义多个分隔符,只要出现一个字符就可以作为分隔符     以 :和/ 为分隔符

1、awk常用内置变量

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

打印包含root的行 $0 整行     $1:第一列    

打印以:和/ 为分隔符且包含root的行的列数 

打印以:和/ 为分隔符 包含root的行数

打印以:为分隔符包含root的行数和整行内容

打印第二行       打印第二行以:为分隔符打印第一列

 打印最后一列

打印显示行号和整行内容

 打印显示汇总行数以及打印汇总最后一行内容

以:为分隔符打印文本内容有多少行和多少列 

查询本机的网卡IP,与使用流量

 显示磁盘可用空间

打印出第二行的第四列 

2、BEGIN、END的用法

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

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

BEGIN的运算案例:

 定义变量打印输出结果

 不定义变量,初始值为0,如果是字符串为空

 2**3和2^3 为2的3次方

3、模糊匹配

用~表示包含,!~表示不包含

 打印出第一列包含root和ro的行

 打印显示不包含结尾是nologin,打印出第一列和第7列

4、数值与字符串的比较

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

打印显示第五行 

打印显示小于五行的内容

 以:为分隔符打印显示第三列为0 的内容

精确查找,$1 第一列一定是root的行显示 

查询第3列大于1000的内容并显示(其中1000以上的值表示普通用户)

5、逻辑运算&&和||

||:或 表示同时满足

&&:且  满足一个即可

打印显示第三列小于10或第三列大于等于1000的行

 打印显示大于4行且小于10行的内容 也就是5-9行的内容

 输出数字1~200,打印显示第一列能被7整除的数且包含数字7

6、其他内置变量的用法

NF 字段个数 (读取的列数)
NR 记录数(行号)从1开始,新的文件延续上面的计数,新文件不从1开始
FNR 读取文件的记录数(行号)从1开始,新的文件重新从1开始计数
FS

输入字段的分隔符 ,默认为空格

OFS

输出的字段分隔符 默认为空格

RS 输入行分隔符,默认为换行符
ORS 输出行分隔符,默认为换行符

案例

OFS定义输出时以:为分隔符,$1,$2用,分开  OFS输出时定义分隔符------ 打印出第一列和第二列 

 FNR和NR的区别​​​​​​​   FND读取文件的行号,从1开始新文件也是从1开始   打印出2个文件的内容

 以:为换行符,打印整行内容

 以空格为分隔符,输出为多行合并,默认为回车键

7、awk高级用法

定义引用变量

调用函数getline:读取一行数据的时候并不是得到当前行而是当前行的下一行

 awk通过管道符号、双引号调用shell命令

echo $PATH | awk 'BEGIN{RS=":"};END {print NR}’
#统计以冒号分隔的文本段落数,END语句块中,往往会放入打印结果等语句

awk -F: '/bash$/{print | "wc -l")' /etc/passwd
#调用wc -l命令统计使用bash 的用户个数,等同于grep -c "bash$" /etc/passwd
awk -F: ‘/ bash$/ {print}' pasawd l wc -l

查看内容百分比

 free -m l awk '/Mem:/ {print int($3/($3+$4)*100)"%")′

​​​​​​​

free -m|awk ‘/Mem:/ {print $3/$2*100}'
free -m | awk '/Mem:/{print $3/$2*100}' | awk -F. '{print $1"%"}'
比较后取整

 查看CPU利用率

top -b -n 1 l grep Cpu | awk -F, {print $4}' l awk '{print $1}′

​​​​​​​#查看当前cPv空闲率,(-b -n1表示只需要1次的输出结果)       

CPu使用率
 
cpu_us=`top -b -n 1 l grep Cpu | awk '{ print $2}`
 
cpu_sy=`top -b -n 1 | grep Cpu | awk -F, '{print $2}' | awk '{print $1}'`
 
cpu_sum=$ (($cpu_us+$cpu_sy))
 
echo $cpu_sum

查看重启时间

last 是你关机或重启的记录,last | tail -1 是最后一次关机或重启的时间;
开机时间记录在/proc/uptime中可用
date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
来查看开机时间,和运行时间。(+号前面有空格)

 显示上一次重启时间

 调用w命令,并用来统计在线用户数

 8、套用数组

echo "A B C D" l awk '{OFS="I"; print $0;$1=$1 ;print $0} '    

​$1-$1是用来激活$0的重新赋值,也就是说字段$1...和字段数NF的改变会促便awk重新计算$0的值,通常是在改变OFS后而需要输出$0时这样做     

awk ‘BEGIN{a[0]=10;a[1]=20; print a[1]}’
 
awk 'BEGIN{a[o]=10;a[1]=20; print a[o]'
 
awk 'BEGIN{a[ "abc"]=10; a["xyz"]=20;print a ["abc"]}'
 
awk 'BEGINia [ "abc"]=10;a ["xyz"]=20; print a["xyz"]}’
 
awk 'BEGIN{a ["abe"]="aabbcc"; a["xyz"]="xyyzz" ; print a ["xyz"]}'
 
awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print i,a[i]}}'

​PS1:BEGIN中的命令只执行一次

PS2: awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

使用awk统计httpd访问日志中每个客户端IP的出现次数      

awk '(ip[$1]++);END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log

注:定义数组,数组名称为ip,数字的下标为日怎文件的第1列(也就是客户A的i?地址),+t的目的在于对客户端进行统计计数,客户端IP出现―次计数器就加i。END中的指令在读取完文件后执行,通过循环将所有统计信息输出,for循环遍历的是数组名ip的下标。

 脚本编写访问主机超过几次报警

#!/bin/ bash
x='awk '/Failed password/{ip[$11]++};END{for(i in ip) (print i","ip[i]}}’/var/log/secure'
#190.168.80.13 3
for j in $x
do
ip= "echo $j l awk -F ", " '{print $1}"
num="echo $j l awk -F ", " '{print $2} "
if[ $num -ge 3 ];then
echo“警告$ip访问本机失败了$num次,请速速处理!”
fi
done

五、总结

本篇主要列举了很多关于awk的案例,让读者更清楚的了解awk的每个参数的用法以及格式,还有以及awk的工作原理,以及awk是一个功能强大的编辑工具无交互的情况下实现复杂的文本操作。

原文链接:https://blog.csdn.net/weixin_56270746/article/details/124650232

最后修改:2023 年 10 月 26 日
如果觉得我的文章对你有用,请随意赞赏