在云计算蓬勃发展的今天,与其在家闲着,不如立即开始学习,希望可以帮助你在“逆境”中成长,从容开启新的一年。下面千锋给大家讲解一下:linux文本处理三剑客之AWK。
awk处理过程: 依次对每一行进行处理,然后输出,与sed区别:awk读到内存。
默认分隔符是空格或者tab键
案例一:
BEGIN{} {} END{} filename
行处理前 行处理 行处理后 文件名
或者:
[root@awk ~]# cat /etc/hosts | awk ‘BEGIN{print 1/2} {print “ok”} END{print “----”}’
0.5
ok
ok
记录和字段
awk假设它的输入是有结构的,而不是一串无规则的字符。默认它将每个输入行作为一条记录,而将由空格或制表符分隔的单词作为字段。
awk 按记录处理:一行是一条记录,因为awk默认以换行符分开的字符串是一条记录。(默认\n换行符:记录分隔符)
记录:以记录分割符分割的字符串 默认是换行\n
字段:以字段分割符分割的字符串 默认是单个或多个“ ” tab键。
========================================
awk中的变量:
$0:表示整行;
NF : 统计字段的个数
$NF:是number finally,表示最后一列的信息
RS:输入记录分隔符;
ORS:输出记录分隔符。
NR:打印记录号,(行号)
FNR:可以分开,按不同的文件打印行号。
FS : 输入字段分隔符,默认为一个空格。
OFS 输出的字段分隔符,默认为一个空格。
FILENAME 文件名 被处理的文件名称
$1 第一个字段,$2第二个字段,依次类推…
案例:
FS(输入字段分隔符)—一般简写为-F(属于行处理前)
[root@awk ~]# cat /etc/passwd | awk ‘BEGIN{FS=":"} {print $1}’
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
games
[root@awk ~]# cat /etc/passwd | awk -F : ‘{print $1}’
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
注:如果-F不加默认为空格区分!
===============================================================
OFS(输出字段分隔符)
[root@awk ~]# cat /etc/passwd | awk ‘BEGIN{FS=":";OFS="…"} {print $1,$2}’
root…x
bin…x
daemon…x
adm…x
lp…x
sync…x
shutdown…x
halt…x
mail…x
======================================================================
1.创建两个文件
[root@awk ~]# vim a.txt
love
love.
loove
looooove
[root@awk ~]# vim file1.txt
isuo
IPADDR=192.168.246.211
hjahj123
GATEWAY=192.168.246.1
NETMASK=255.255.255.0
DNS=114.114.114.114
NR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号
[root@awk ~]# awk ‘{print NR,$0}’ a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
6 isuo
7 IPADDR=192.168.246.211
8 hjahj123
9 GATEWAY=192.168.246.1
10 NETMASK=255.255.255.0
11 DNS=114.114.114.114
FNR:表示记录编号, 当awk将行为记录时, 该变量相当于当前行号(不同文件分开)
[root@awk ~]# awk ‘{print FNR,$0}’ a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
1 isuo
2 IPADDR=192.168.246.211
3 hjahj123
4 GATEWAY=192.168.246.1
5 NETMASK=255.255.255.0
6 DNS=114.114.114.114
===========================================================
RS(输入记录分隔符)
1.创建一个文件
[root@awk ~]# vim passwd
root❌0:0:root:/root:/bin/bashbin❌1:1:bin:/bin:/sbin/nologin
[root@zabbix-server ~]# cat passwd | awk ‘BEGIN{RS=“bash”} {print $0}’
root❌0:0:root:/root:/bin/
bin❌1:1:bin:/bin:/sbin/nologin
ORS(输出记录分隔符)
2.对刚才的文件进行修改
[root@awk ~]# vim passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
[root@awk ~]# cat passwd | awk ‘BEGIN{ORS=" "} {print $0}’
root❌0:0:root:/root:/bin/bash bin❌1:1:bin:/bin:/sbin/nologin daemon❌2:2:daemon:/sbin:/sbin/nologin
===========================================================
NF:统计列的个数
[root@awk ~]# cat /etc/passwd | awk -F : ‘{print NF}’
7
7
7
7
$NF:打印最后一列
[root@awk ~]# cat /etc/passwd | awk -F : ‘{print $NF}’
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
练习1:将文件合并为一行
[root@awk ~]# cat /etc/passwd | awk ‘BEGIN{ORS="" } {print $0}’
练习2:把一行内容分成多行
1.首先创建一个文件
[root@awk ~]# vim d.txt
root❌0:0:root:/root:/bin/bash
[root@awk ~]# cat d.txt | awk ‘BEGIN{RS=":"} {print $0}’
root
x
0
0
root
/root
1.打印一个文件中的第2列和第3列
2.打印指定行指定列的某个字符
3.统计一个文件的行数
4.在awk中使用if条件判断
++i:从1开始加,赋值在运算
i++: 从0开始加,运算在赋值
if语句:
{if(表达式){语句;语句;…}}
显示管理员用户姓名
统计系统用户
5.在awk中使用for循环
root❌0:0:root:/root:/bin/bash
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
分别打印每行每列
root
x
0
0
root
/root
/bin/bash
数组遍历–用来统计网站日志,tcp连接状态等。
++i:从1开始加,赋值在运算
i++: 从0开始加,运算在赋值
按索引遍历:
1.先创建一个test文件
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
0 root
1 bin
1 root
2 bin
注意:变量i是索引
实际案例
2.统计nginx日志出现的状态码
3.统计当前nginx日志中每个ip访问的数量
4.统计某一天的nginx日志中的不同ip的访问量
5.统计nginx日志中某一天访问最多的前10个ip
sort:排序,默认升序
-k:指定列数
-r:降序
-n:以数值来排序
6.统计tcp连接的状态—下去自己查各个状态,包括什么原因造成的!
LAST_ACK 5 (正在等待处理的请求数)
SYN_RECV 30
ESTABLISHED 1597 (正常数据传输状态)
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)
UV与PV统计
=================================================================
1.根据访问IP统计UV
uniq:去重
-c:每行连续出现的次数
2.更具访问ip统计PV
或者是url
3.查询访问最频繁的URL
more:以一页一页的形式显示
4.查询访问最频繁的IP