Linux三剑客——awk
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux三剑客——awk相关的知识,希望对你有一定的参考价值。
Linux三剑客——awk
DKing~共享
1.1 awk执行过程
awk读入第一行内容
判断是否符合模式中的条件NR>=2(是否让你进入大门)
如果匹配则执行对应的动作{print $0}
如果不匹配条件,继续读取下一行
继续读取下一行
重复以上过程,直到读取到最后一行(EOF:end of field)
1.2 记录和字段
record 表示记录、行 记录相当于行
field 表示区域、字段 字段相当于列
1.2.1 记录(行)
awk默认情况下每一行都是一个记录(record)
RS(record separator)是输入数据记录分隔符,表示每个记录输入的时候的分隔符,即行与行之间如何分隔,即RS表示每行的结束标志
NR(number of record)记录行号,表示当前正在处理的记录(行)的号码,读取新行时候会自动+1
ORS(output record separator)输出记录分隔符
awk使用内置变量RS来存放输入记录分隔符,RS表示的是输入的记录分隔符,可通过BEGIN模块重新定义
1.2.2 字段(列)
每条记录都是由多个区域(field)组成的,默认情况下区域之间的分隔符是由空格来分隔,并且将分隔符记录在内置变量FS中,每行记录的区域数保存在awk的内置变量NF中
FS(field separator)输入字段(列)分隔符,分隔符就是菜刀,把一行字符串切割成多个区域
awk -F 实际上就是修改FS的内容,相当于 awk 'BEGIN{FS=":"}'
NF(number of fields)表示一行中字段(列)的个数,即每行有多少列
OFS输出字段(列)分隔符
$符号表示取某个列,$1 $2 $NF
通过RS、FS决定awk如何读取数据,还可以修改ORS、OFS的值指定awk如何输出数据,下图示例:
1.3 awk新增的参数和符号
~ 表示匹配,包含
!~ 表示不匹配,不包含
gsub 函数,用于替换
gsub (/你要找什么/,“替换成什么”,第几列)
i=i+1 等同于i++ 统计次数
i=i+$n i+=$n 累加总和
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
1.3.1 gsub的替换功能
# awk '{gsub(/:/,"¥",$NF);print}' reg.txt
Zhang Dandan 41117397 ¥250¥100¥175
Zhang Xiaoyu 390320151 ¥155¥90¥201
gsub函数
gsub(/你要找什么/,“替换成什么”,第几列)
1.3.2 i++统计次数
# seq 10 |awk '{i=i+1;print i}' 统计次数并显示过程
# seq 10 |awk '{i=i+1}END{print i}' 统计次数只显示最终结果
i=i+1可用i++表示
# seq 10 |awk '{i=i+$1}END{print i}' 计算第1列次数总和
# seq 10 |awk '{i+=$n}END{print i}' i+=$n等同于i=i+$n
1.4 awk模式与动作
awk [ options ] 'pattern {action}' file
awk参数 模式动作
通俗讲就是给定条件然后去做什么,awk ‘找谁{干啥}’‘模式{动作}’
awk的常用模式:
正则表达式作为模式 支持BRE ERE
比较表达式作为模式 NR>10
范围模式
特殊模式BEGIN和END
1.4.1 正则表达式作为模式:
实例1-1 从具体某一列中查找内容
# awk '$3~/0+/' /server/files/reg.txt
Zhang Xiaoyu 390320151 :155:90:201
实例1-2 $(NF-1)与$NF-1的区别
# awk -F '[: ]+' '/Zhang/{print $1,$2,$(NF-1)}' reg.txt
Zhang Dandan 100
Zhang Xiaoyu 90
# awk -F '[: ]+' '/Zhang/{print $1,$2,$NF-1}' reg.txt
Zhang Dandan 174
Zhang Xiaoyu 200
1.4.2 范围模式
范围模式简单理解就是从哪里来,到哪里去
匹配从条件1开始到条件2介绍的范围
# awk 'NR==1,NR==3' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
1.5 awk数组
以数字做索引,方便快捷查询内容,数组索引可以是数字和字符串。在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。
# awk 'BEGIN{h[1]="dou";h[2]="qin";h[3]="feng";print h[1],h[2],h[3]}'
dou qin feng
1.5.1 分析用户登录日志
找出攻击者ip地址和攻击次数
# awk '$6~/Failed/{h[$(NF-3)]++}END{for( pol in h ) print pol,h[pol]}' secure-20161219 |sort -nk2|column -t|tail
找出被攻击用户和攻击次数
# awk '$6~/Failed/{h[$(NF-5)]++}END{for( pol in h ) print pol,h[pol]}' secure-20161219 |sort -nk2|column -t|tail
1.5.2 排序命令小结
1.5.3 sort
sort 将文件进行排序
-b:忽略每行前面开始出的空格字符;
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-n:依照数值的大小排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
1.5.4 uniq
uniq 用于报告或忽略文件中的重复行,一般与sort命令结合使用
-c或——count:在每列旁边显示该行重复出现的次数;
-d或--repeated:仅显示重复出现的行列;
-u或——unique:仅显示出现一次的行列;
1.5.5 column
column 纵向列表
-t 以空格为标杆自动对齐
以上是关于Linux三剑客——awk的主要内容,如果未能解决你的问题,请参考以下文章