Shell编程四剑客之AWK

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 ~]# df -h | awk '{print $1}' 
文件系统
devtmpfs
tmpfs
tmpfs
tmpfs
/dev/mapper/centos-root
/dev/sr0
/dev/sda1
tmpfs

2. AWK以空格、冒号、/为分割

[root@localhost ~]# awk -F '[ :/]' '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt

3. AWK以冒号分割,打印第一列,同时将内容追加到user.txt下:

[root@localhost ~]# awk -F: '{print $1 >> "user.txt"}' /etc/passwd
[root@localhost ~]# cat user.txt 
root
bin
daemon
adm
lp
sync
shutdown
halt

4. 打印/etc/passwd文件中的第3行至第5行,NR表示打印行,$0表示文本所有:

[root@localhost ~]# awk 'NR==3,NR==5 {print}' /etc/passwd
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 ~]# awk 'NR==3,NR==5 {print $0}' /etc/passwd
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 ~]# awk -F'[ :/]' 'NR==3,NR==5 {print $1,$NF}' /etc/passwd
daemon nologin
adm nologin
lp nologin

6. 打印/etc/passwd文件中,长度大于50的行号:

[root@localhost ~]# awk 'length($0)>50 {print NR}' /etc/passwd
14
18

7. AWK引用Shell变量,使用-v或者双引号+单引号即可:

[root@localhost ~]# awk -F'[ /:]' -v user=hello  '{print user, $NF}' /etc/passwd
hello bash
hello nologin
hello nologin
hello nologin
hello nologin
hello sync
hello shutdown
hello halt
hello nologin
hello nologin

[root@localhost ~]# user="hello";echo|awk '{print "'$user'"}'
hello

8. AWK以冒号 空格/切割,打印第一列同时只显示前5行:

[root@localhost ~]# cat  /etc/passwd|head -5|awk  -F'[ :/]'   '{print $1}'
root
bin
daemon
adm
lp
[root@localhost ~]# awk -F'[ :/]' 'NR<=5 {print $1}' /etc/passwd
root
bin
daemon
adm
lp

9. Awk指定文件/etc/passwd第三列的总和:

[root@localhost ~]# awk -F'[ /:]' '{print $3}' /etc/passwd
0
1
2
3
4
5
6
7
8
11
12
14
99
192
81
999
173
74
89
998
1000
[root@localhost ~]# cat /etc/passwd |awk  -F'[ :/]' '{sum+=$3}END{print sum}'
3778

10. AWK NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕:

[root@localhost ~]# awk  -F:  'NR%2==0 {next} {print NR,$1}'  /etc/passwd
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 ~]# echo 3 2 1 | awk '{ if(($1>$2)||($1>$3)) { print $2} else {print $1} }'
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值