一、awk工具
1、awk工具简介
awk是功能强大的编辑工具,在无交互的情况下实现复杂的文本操作。它是专门为文本处理设计的编程语言,也是处理软件,通常用于扫描、过滤、统计汇总工作,数据可以来自标准输入也可以是管道或文件。
2、awk的格式
awk 选项 '模式或条件{操作}'文件1文件2...
awk -f 脚本文件 文件1 文件2...
格式 :awk关键字 选项 命令部分 '{XXXXX}' 文件名
3、awk工作原理
当读取到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出,如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行第三次逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
sed命令常用于一整行的处理,而awk比较、倾向于将一行分成多个''"字段然后进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符" &&表示“与” || "、"表示或 "!"表示非";还可以进行简单的数学运算,如+、-、*、/、%、^、分别表示加减乘除、取余和乘方。
4、awk内置变量
FS:指定每行文本的字段分隔符,缺省为空格或制表位
NF:当前处理的行的字段个数
NR:当前处理的行的行号(序数)
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
FILENAME:被处理的文件名
二、awk案例
1、示例1:awk简单的用法
2、示例二:awk加入差数案例
3、示例三:BEGIN和END的用法
逐行执行开始之前执行上面任务结束之后再执行什么任务,用BEGIN、END
BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
END一般用来做汇总操作,仅在读取完数据记录之后执行一次
4、示例四:模糊匹配案例
5、示例5:其他内置变量用法案例
其他内置变量的用法FS(输入)、OFS、NR、FNR、RS、ORS
NR:行数 NF:列数 FS:分列 RS:分行
FS:输入字段的分隔符 默认是空格
OFS:输出字段的分隔符 默认也是空格
FNR:读取文件的记录(行号),从1开始,新的文件重新从1开始计数
RS:输入行分隔符 默认为换行
ORS:输出行分隔符,默认也是为换行符
6、awk高级用法案例
7、awk配合循环语句,函数、数组的使用案例
8、awk通过管道符号、双引号调用shell命令
内存!!!
CPU空闲率
显示主机上次重启时间
调用w命令,并用来统计在线用户数量
重点
awk对文件进行流处理,每次读取一行。$1就是IP,count[i]++是将IP作为一个数组的下标,并且使得统计这个IP所对应的数组元素自增1.END后面的语句是打印结果,只执行一次
[root@zyf logs]# awk '{i=$1;count[i]++}END{for(i in count)print(i,count [i])}' /var/log/httpd/access_log
#可用awk来统计固定格式日志里的一些数据,如日志中出现过所有不同的IP
awk对文件进行流处理,每次读取一行。$1就是IP,count[i]++是将IP作为一个数组的下标,并且使得统计这个IP所对应的数组元素自增1.END后面的语句是打印结果,只执行一次
awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail -n 10 #用tail显示最后10行
脚本编写访问主机超过几次报警
#!/bin/ bash
x=`awk '/Failed password/{ip[$11]++}END{for(i in ip){print i","ip[i]}}' /var/log/secure`
#192.168.154.20 3
for j in $x
do
ip=`echo $j | awk -F "," '{print $1}'`
num=`echo $j | awk -F "," '{print $2}'`
if [ $num -ge 3 ];then
echo "警告! $ip访问本机失败了$num次,请速速处理!"
fi
done