云计算教程学习路线视频源码课件:linux文本处理三剑客之AWK

在云计算蓬勃发展的今天,与其在家闲着,不如立即开始学习,希望可以帮助你在“逆境”中成长,从容开启新的一年。下面千锋给大家讲解一下:linux文本处理三剑客之AWK。

awk处理过程: 依次对每一行进行处理,然后输出,与sed区别:awk读到内存。

默认分隔符是空格或者tab键

案例一:

BEGIN{} {} END{} filename

行处理前 行处理 行处理后 文件名

awk ‘BEGIN{ print 1/2} {print “ok”} END{print “—”}’ /etc/hosts

或者:

[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

mail

operator

games

[root@awk ~]# cat /etc/passwd | awk -F : ‘{print $1}’

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

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列

cat /etc/passwd | awk -F : ‘{print $2,$5}’

2.打印指定行指定列的某个字符

free -m | awk ‘NR==2 {print $2}’

3.统计一个文件的行数

cat /etc/passwd | awk ‘{print NR}’

4.在awk中使用if条件判断

++i:从1开始加,赋值在运算

i++: 从0开始加,运算在赋值

if语句:

{if(表达式){语句;语句;…}}

显示管理员用户姓名

cat /etc/passwd | awk -F : ‘{if($3==0) {print $1 " is administrator"}}’

统计系统用户

cat /etc/passwd | awk -F : ‘{if($3>=0 && $3<1000){i++}} END{print i}’

5.在awk中使用for循环

cat /etc/passwd | awk ‘{for(i=1;i<=2;i++) {print $0}}’

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

分别打印每行每列

cat /etc/passwd | awk -F : ‘{ for(i=1;i<=NF;i++) {print $i}}’

root

x

0

0

root

/root

/bin/bash

数组遍历–用来统计网站日志,tcp连接状态等。

++i:从1开始加,赋值在运算

i++: 从0开始加,运算在赋值

按索引遍历:

1.先创建一个test文件

vim test.txt

root❌0:0:root:/root:/bin/bash

bin❌1:1:bin:/bin:/sbin/nologin

cat test.txt | awk -F : ‘{username[x++]=$1} END{for(i in username) {print i,username[i]}}’

0 root

1 bin

cat test.txt | awk -F : ‘{username[++x]=$1} END{for(i in username) {print i,username[i]}}’

1 root

2 bin

注意:变量i是索引

实际案例

  1. 统计/etc/passwd中各种类型shell的数量

cat /etc/passwd | awk -F: ‘{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }’

2.统计nginx日志出现的状态码

cat access.log | awk ‘{stat[$9]++} END{for(i in stat){print i,stat[i]}}’

3.统计当前nginx日志中每个ip访问的数量

cat access.log | awk ‘{ips[$1]++} END{for(i in ips){print i,ips[i]}}’

4.统计某一天的nginx日志中的不同ip的访问量

cat access.log |grep ‘28/Sep/2019’ | awk ‘{ips[$1]++} END{for(i in ips){print i,ips[i]}}’

5.统计nginx日志中某一天访问最多的前10个ip

cat access.log |grep ‘28/Sep/2019’ | awk ‘{ips[$1]++} END{for(i in ips){print i,ips[i]}}’ |sort -k2 -rn | head -n 2

sort:排序,默认升序

-k:指定列数

-r:降序

-n:以数值来排序

6.统计tcp连接的状态—下去自己查各个状态,包括什么原因造成的!

netstat -n | awk ‘/^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}’

LAST_ACK 5 (正在等待处理的请求数)

SYN_RECV 30

ESTABLISHED 1597 (正常数据传输状态)

FIN_WAIT1 51

FIN_WAIT2 504

TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)

UV与PV统计

=================================================================

1.根据访问IP统计UV

cat access.log | awk ‘{print $1}’ |sort |uniq -c | wc -l

uniq:去重

-c:每行连续出现的次数

2.更具访问ip统计PV

cat access.log | awk ‘{print $1}’ |wc -l

或者是url

cat access.log | awk ‘{print $7}’ |wc -l

3.查询访问最频繁的URL

cat access.log | awk ‘{print $7}’|sort | uniq -c |sort -n -k 1 -r | more

more:以一页一页的形式显示

4.查询访问最频繁的IP

cat access.log | awk ‘{print $1}’|sort | uniq -c |sort -n -k 1 -r | more

你可能感兴趣的:(云计算教程学习路线视频源码课件:linux文本处理三剑客之AWK)