-- 条件 文件 3.1 范围 区别 linux 三剑客 ber new
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++ 统计次数
i=i+1 可用 i++ 表示
# seq 10 |awk '{i=i+1;print i}' 统计次数并显示过程
# seq 10 |awk '{i=i+1}END{print i}' 统计次数只显示最终结果
1.4 awk 模式与动作
# seq 10 |awk '{i=i+$1}END{print i}' 计算第 1 列次数总和
# seq 10 |awk '{i+=$n}END{print i}' i+=$n 等同于 i=i+$n
awk [options] 'pattern {action}' file
awk 参数 模式动作
通俗讲就是给定条件然后去做什么,
awk 的常用模式:
awk '
找谁
{
干啥
}
''
模式
{
动作
}
'
正则表达式作为模式 支持 BRE ERE
比较表达式作为模式 NR>10
范围模式
特殊模式 BEGIN 和 END
1.4.1 正则表达式作为模式:
实例 1-1 从具体某一列中查找内容
实例 1-2 $(NF-1) 与 $NF-1 的区别
# awk '$3~/0+/' /server/files/reg.txt
Zhang Xiaoyu 390320151 :155:90:201
1.4.2 范围模式
# 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 开始到条件 2 介绍的范围
1.5 awk 数组
# 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
以数字做索引,方便快捷查询内容,数组索引可以是数字和字符串.在 awk 中数组叫做关联数组 (associative arrays).awk 中的数组不必提前声明,也不必声明大小.数组元素用 0 或空字符串来初始化,这根据上下文而定.
1.5.1 分析用户登录日志
# awk 'BEGIN{h[1]="dou";h[2]="qin";h[3]="feng";print h[1],h[2],h[3]}'
dou qin feng
找出攻击者 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
来源: http://www.bubuko.com/infodetail-2458780.html