目录
一、awk概述
1.1、简介
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件。
1.2、工作原理
1.逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
2.awk倾向于将一行分成多个"字段"然后再进行处理。
3.awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
4.使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"|"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end"}' file
其中:BEGIN END 是 AWK 的关键字部,因此必须大写;这两个部分开始块和结束块是可选的
1.3、执行流程
开始块(BEGIN block)
顾名思义,开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。一般情况下,我们在开始块中初始化一些变量。BEGIN是AWK的关键字,因此它必须是大写的。不过,开始块部
分是可选的,你的程序可以没有开始块部分。
主体块(Body Block)
对于每一个输入的行,都会执行一次主体部分的命令。默认情况下,对于输入的每一行,AWK都会执行命令。注意:在主体块部分,没有关键字存在。
结束块(END Block)
它是在程序结束时执行的代码。END也是AWK的关键字,它也必须大写。与开始块相似,结束块也是可选的。
AWK 工作通过三个步骤:
1、读(Read):从文件、管道或标准输入中读入一行然后把它存放到内存中
2、执行(Execute):对每一行数据,根据 AWK 命令按顺序执行。默认情况是处理每一行数据,也可以指定模式
3、重复(Repeat):一直重复上述两个过程直到文件结束
二、awk实战案例
awk 选项' 模式或条件{操作}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ..
格式:awk关键字 选项 命令部分 '{xxxx}' 文件名
AWK 支持两种不同类型的变量:
内建变量(可直接使用),自定义变量awk 内置变量(预定义变量)
2.1、内建变量
FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。
FILENAME:被处理的文件名。
RS:行分隔符。数据记录分隔,默认为\n,即每行为一条记录
例1、简单使用
例2、-F分隔符使用
定义多个分隔符
2.2、内置变量
awk常用内置变量:
$1:代表第一列
$2:代表第二列以此类推
$0:代表整行
NF:一行的列数
NR:行数
例1、打印包含root的整行内容、打印包含root的行的第一列、 打印包含root的行的第一列和第六列
例2、打印每一行的列数 、显示行号
例3、对行、列的简单理解
例4、扩展生产案列:网卡的ip、流量
其他内置变量的用法FS(输入):FS:输入字段的分隔符 默认是空格OFS:输出字段的分隔符 默认也是空格FNR:读取文件的记录数(行号),从1开始,新的文件重新重1开始计数RS:输入行分隔符 默认为换行符ORS:输出行分隔符 默认也是为换行符
FS是是通过分隔符来确定列;OFS
例6、NR和FNR的对比
NR是不看文件多少一直按顺序排下去;FNR是按文件排序,每一个新文件就重新排序
例7、RS和ORS的对比
RS是根据分隔符将内容拆开表示;ORS是将所有内容分割符隔开然后整体表示
2.3、BEGIN、END 运算
BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次END一般用来做汇总操作,仅在读取完数据记录之后执行一次
例1、简单数字运算
关于数值与字符串的比较比较符号:== != <= >= < >
例2、
逻辑运算 && ||&& 和 || 是逻辑运算符,用于组合多个条件并控制程序流程。&& 要求所有条件都为真时才为真,否则为假。|| 只要有一个条件为真就为真,全为假时才为假。
例3、合理应用逻辑符
2.4、awk高级用法
2.5、awk if 语句
2.6、BEGIN END 流程
2.7、AWK数组
PS1:BEGIN 中的命令只执行一次PS2: awk 数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号
2.8、awk循环
结合for循环来进行操作
[root@wangming ~]#cat awk3.sh
#!/bin/ bash
x=`awk '/Failed password/{ip[$11]++}END{for(i in ip){print i","ip[i]}}'
/var/log/secure`
6、总结
#190.168.10.22 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