Shell编程四剑客之AWK
- AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK,AWK是一个行级文本高效处理工具,AWK经过改进生成的新的版本有Nawk、Gawk,一般Linux默认为Gawk,Gawk是 AWK的GNU开源免费版本。
- AWK基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。其语法参数格式为,AWK常用参数、变量、函数详解如下:
awk -option ‘pattern + {action}’ file
1. AWK基本语法参数详解:
- 单引号’ '是为了和shell命令区分开;
- 大括号{ }表示一个命令分组;
- pattern是一个过滤器,表示匹配pattern条件的行才进行Action处理;
- action是处理动作,常见动作为Print;
- 使用#作为注释,pattern和action可以只有其一,但不能两者都没有。
2. AWK内置变量详解:
FS | 分隔符,默认是空格; |
---|
OFS | 输出分隔符; |
NR | 当前行数,从1开始 |
NF | 当前记录字段个数 |
$0 | 当前记录 |
$1~$n | 当前记录第n个字段(列) |
3. AWK内置函数详解:
gsub(r,s) | 在$0中用s代替r |
---|
index(s,t) | 返回s中t的第一个位置 |
length(s) | s的长度 |
match(s,r) | s是否匹配r |
split(s,a,fs) | 在fs上将s分成序列a |
substr(s,p) | 返回s从p开始的子串 |
4. AWK常用操作符,运算符及判断符:
++ – | 增加与减少( 前置或后置) |
---|
^ ** | 指数( 右结合性) |
! + - | 非、一元(unary) 加号、一元减号; |
+ - * / % | 加、减、乘、除、余数 |
< <= == != > >= | 数字比较 |
&& | 逻辑and |
|| | 逻辑or |
= += -= *= /= %= ^= **= | 赋值 |
5. AWK与流程控制语句:
- if(condition) { } else { };
- while { };
- do{ }while(condition);
- for(init;condition;step){ };
- break/continue。
常用AWK工具企业演练案列:
1. AWK打印硬盘设备名称,默认以空格为分割:
[root@localhost ~]
文件系统
devtmpfs
tmpfs
tmpfs
tmpfs
/dev/mapper/centos-root
/dev/sr0
/dev/sda1
tmpfs
2. AWK以空格、冒号、/为分割
[root@localhost ~]
root
bin
daemon
adm
lp
sync
shutdown
halt
3. AWK以冒号分割,打印第一列,同时将内容追加到user.txt下:
[root@localhost ~]
[root@localhost ~]
root
bin
daemon
adm
lp
sync
shutdown
halt
4. 打印/etc/passwd文件中的第3行至第5行,NR表示打印行,$0表示文本所有:
[root@localhost ~]
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
或者:
[root@localhost ~]
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
5. 打印/etc/passwd文件中的第3行至第5行的第一列与最后一列:
[root@localhost ~]
daemon nologin
adm nologin
lp nologin
6. 打印/etc/passwd文件中,长度大于50的行号:
[root@localhost ~]
14
18
7. AWK引用Shell变量,使用-v或者双引号+单引号即可:
[root@localhost ~]
hello bash
hello nologin
hello nologin
hello nologin
hello nologin
hello sync
hello shutdown
hello halt
hello nologin
hello nologin
[root@localhost ~]
hello
8. AWK以冒号 空格/切割,打印第一列同时只显示前5行:
[root@localhost ~]
root
bin
daemon
adm
lp
[root@localhost ~]
root
bin
daemon
adm
lp
9. Awk指定文件/etc/passwd第三列的总和:
[root@localhost ~]
0
1
2
3
4
5
6
7
8
11
12
14
99
192
81
999
173
74
89
998
1000
[root@localhost ~]
3778
10. AWK NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕:
[root@localhost ~]
1 root
3 daemon
5 lp
7 shutdown
9 mail
11 games
13 nobody
15 dbus
17 abrt
19 postfix
21 ys
11. AWK添加自定义字符:
ifconfig ens33 | grep "inet"|awk 'NR<2{print "ip_"$2}'
12. AWK与if组合实战,判断数字比较:
[root@localhost ~]
2
13. awk分析Nginx访问日志的状态码404、502等错误信息页面,统计次数大于20的IP地址。
awk '{if ($9~/404|502|403/) print $1,$9}' access.log|sort|uniq –c|sort –nr | awk '{if($1>20) print $2}'
14. Awk统计服务器状态连接数:
netstat -an | awk '/tcp/ {print $NF}' | sort | uniq -c