Linux三剑客——awk

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux三剑客——awk相关的知识,希望对你有一定的参考价值。

Linux三剑客——awk

DKing~共享

1.1 awk执行过程

awk读入第一行内容

判断是否符合模式中的条件NR>=2(是否让你进入大门)

       如果匹配则执行对应的动作{print $0}

       如果不匹配条件,继续读取下一行

继续读取下一行

重复以上过程,直到读取到最后一行(EOFend of field

1.2 记录和字段

record    表示记录、行           记录相当于行

field       表示区域、字段       字段相当于列

1.2.1 记录(行)

awk默认情况下每一行都是一个记录(record

RSrecord separator)是输入数据记录分隔符,表示每个记录输入的时候的分隔符,即行与行之间如何分隔,即RS表示每行的结束标志

NRnumber of record)记录行号,表示当前正在处理的记录(行)的号码,读取新行时候会自动+1

ORSoutput record separator)输出记录分隔符

awk使用内置变量RS来存放输入记录分隔符,RS表示的是输入的记录分隔符,可通过BEGIN模块重新定义

1.2.2 字段(列)

技术分享图片

每条记录都是由多个区域(field)组成的,默认情况下区域之间的分隔符是由空格来分隔,并且将分隔符记录在内置变量FS中,每行记录的区域数保存在awk的内置变量NF

FSfield separator)输入字段(列)分隔符,分隔符就是菜刀,把一行字符串切割成多个区域

awk -F   实际上就是修改FS的内容,相当于 awk 'BEGIN{FS=":"}'

NFnumber of fields)表示一行中字段(列)的个数,即每行有多少列

OFS输出字段(列)分隔符

$符号表示取某个列,$1 $2 $NF

通过RSFS决定awk如何读取数据,还可以修改ORSOFS的值指定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

       范围模式

       特殊模式BEGINEND

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的主要内容,如果未能解决你的问题,请参考以下文章

Linux三剑客

Linux三剑客

Linux三剑客之grepegrep及正则表达式使用详解

Linux三剑客AwkSedGrep 命令详解

Linux入门开发: 学习linux三剑客(awksedgrep)(上)

linux三剑客之sed史上最实用教程!