目录
引言: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
此处评论已关闭