Linux系统三剑客之AWK

awk的使用

awk的处理方式与格式

awk的处理方式

  • awk一次处理一行内容
  • awk可以对每行进行切片处理

示例:

bash 复制代码
awk '{print $1}'

awk的格式

命令行格式
bash 复制代码
awk [options] 'command' files

command1:pattern {awk操作命令}

操作命令:

  • 内置函数:print(),printf(),getline...
  • 控制指令:if(){...}else{...},while()
脚本格式
bash 复制代码
awk -f awk-script-file file(s)
扩展格式

BEGIN{...}{...}END{...}

示例:

以制表的形式输出passwd文件中的NR,NF,User

bash 复制代码
awk -F ':' 'BEGIN{print "Line\t Columns User"}{print NR"\t",NF"\t",$1}END{print "-------"FILENAME"-------"}' passwd

结果:

Line     Columns User
1        7       root
2        7       bin
3        7       daemon
4        7       adm
5        7       lp
6        7       sync
7        7       shutdown
8        7       halt
9        7       mail
10       7       operator
11       7       games
12       7       ftp
13       7       nobody
14       7       systemd-network
15       7       dbus
16       7       polkitd
17       7       abrt
18       7       tss
19       7       postfix
20       7       chrony
21       7       sshd
22       7       mysql
-------passwd-------

awk的内置参数

变量

  • $0 : 表示整个当前行

  • $1 : 表示第一个字段

  • $2 : 每行第二个字段

    以此类推

  • NR : 每行的记录号(行号)

  • NF : 字段数(以分隔符为参照物)

  • FILENAME : 正在处理的文件名

    示例:

bash 复制代码
awk -F ':' '{print NR,NF}' /etc/passwd

结果:

1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7
10 7
11 7
12 7
13 7
14 7
15 7
16 7
17 7
18 7
19 7
20 7
21 7
22 7   
bash 复制代码
awk -F ':' '{print FILENAME}' /etc/passwd

结果:

/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd
/etc/passwd 
  • ~ : 对变量进行更加详细的匹配

示例:

输出passwd文件中以a-c开头的用户名

bash 复制代码
awk -F ':' '$1~/^[a-c].*/{print $1}' passwd

结果:

bin
adm
abrt
chrony

输出passwd文件中不以a-c开头的用户名

bash 复制代码
awk -F ':' '$1!~/^[a-c].*/{print $1}' passwd

结果:

root
daemon
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
tss
postfix
sshd
mysql
  • ">,<,==,!=" : 逻辑判断

示例:

输出passwd文件中UID大于80的用户名和UID

bash 复制代码
awk -F ':' '$3>80{print $1,$3}' passwd

结果:

nobody 99
systemd-network 192
dbus 81
polkitd 999
abrt 173
postfix 89
chrony 998

分隔符

options: -F field-separator(默认为空格)

示例:

打印passwd中的组id

bash 复制代码
awk -F ':' '{print $3}' /etc/passwd

结果:

0
1
2
3
4
5
6
7
8
11
12
14
99
192
81
999
173
59
89
998
74
27

打印passwd中的用户名组id

bash 复制代码
awk -F ':' '{print "USER:"$1,"  UID:"$3}' /etc/passwd

结果:

USER:root  UID:0
USER:bin  UID:1
USER:daemon  UID:2
USER:adm  UID:3
USER:lp  UID:4
USER:sync  UID:5
USER:shutdown  UID:6
USER:halt  UID:7
USER:mail  UID:8
USER:operator  UID:11
USER:games  UID:12
USER:ftp  UID:14
USER:nobody  UID:99
USER:systemd-network  UID:192
USER:dbus  UID:81
USER:polkitd  UID:999
USER:abrt  UID:173
USER:tss  UID:59
USER:postfix  UID:89
USER:chrony  UID:998
USER:sshd  UID:74
USER:mysql  UID:27

案例一

显示/etc/passwd每行的行号,每行的列数,对应行的用户名(print,printf)

bash 复制代码
awk -F ':' '{print "Line: " NR,"Columns: "NF,"USER: "$1}' /etc/passwd

结果:

Line: 1 Columns: 7 USER: root
Line: 2 Columns: 7 USER: bin
Line: 3 Columns: 7 USER: daemon
Line: 4 Columns: 7 USER: adm
Line: 5 Columns: 7 USER: lp
Line: 6 Columns: 7 USER: sync
Line: 7 Columns: 7 USER: shutdown
Line: 8 Columns: 7 USER: halt
Line: 9 Columns: 7 USER: mail
Line: 10 Columns: 7 USER: operator
Line: 11 Columns: 7 USER: games
Line: 12 Columns: 7 USER: ftp
Line: 13 Columns: 7 USER: nobody
Line: 14 Columns: 7 USER: systemd-network
Line: 15 Columns: 7 USER: dbus
Line: 16 Columns: 7 USER: polkitd
Line: 17 Columns: 7 USER: abrt
Line: 18 Columns: 7 USER: tss
Line: 19 Columns: 7 USER: postfix
Line: 20 Columns: 7 USER: chrony
Line: 21 Columns: 7 USER: sshd
Line: 22 Columns: 7 USER: mysql    
bash 复制代码
awk -F ':' '{printf("Line: %3s Columns: %s USER: %s\n",NR,NF,$1)}' /etc/passwd

结果:

Line:   1 Columns: 7 USER: root
Line:   2 Columns: 7 USER: bin
Line:   3 Columns: 7 USER: daemon
Line:   4 Columns: 7 USER: adm
Line:   5 Columns: 7 USER: lp
Line:   6 Columns: 7 USER: sync
Line:   7 Columns: 7 USER: shutdown
Line:   8 Columns: 7 USER: halt
Line:   9 Columns: 7 USER: mail
Line:  10 Columns: 7 USER: operator
Line:  11 Columns: 7 USER: games
Line:  12 Columns: 7 USER: ftp
Line:  13 Columns: 7 USER: nobody
Line:  14 Columns: 7 USER: systemd-network
Line:  15 Columns: 7 USER: dbus
Line:  16 Columns: 7 USER: polkitd
Line:  17 Columns: 7 USER: abrt
Line:  18 Columns: 7 USER: tss
Line:  19 Columns: 7 USER: postfix
Line:  20 Columns: 7 USER: chrony
Line:  21 Columns: 7 USER: sshd
Line:  22 Columns: 7 USER: mysql 

案例二

显示/etc/passwd中用户组id大于100的行号和用户名(if(){}else{})

bash 复制代码
awk -F ':' '{if ($3>100){ print "Line: "NR,"USER: "$1}else{print "组id小于100,不与展示"}}' passwd

结果:

组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
组id小于100,不与展示
Line: 14 USER: systemd-network
组id小于100,不与展示
Line: 16 USER: polkitd
Line: 17 USER: abrt
组id小于100,不与展示
组id小于100,不与展示
Line: 20 USER: chrony
组id小于100,不与展示
组id小于100,不与展示  

案例三

显示/etc/passwd中的带有nologin的行的USER信息和组id信息

bash 复制代码
sed -n '/nologin/p' /etc/passwd | awk -F ':' '{print "USER: "$1,"UID: "$3}'
awk -F ':' '/nologin/{print "USER: "$1,"UID: "$3}' /etc/passwd

结果:

USER: bin UID: 1
USER: daemon UID: 2
USER: adm UID: 3
USER: lp UID: 4
USER: mail UID: 8
USER: operator UID: 11
USER: games UID: 12
USER: ftp UID: 14
USER: nobody UID: 99
USER: systemd-network UID: 192
USER: dbus UID: 81
USER: polkitd UID: 999
USER: abrt UID: 173
USER: tss UID: 59
USER: postfix UID: 89
USER: chrony UID: 998
USER: sshd UID: 74

案例四

统计当前文件夹下的文件/文件夹占用的大小

bash 复制代码
ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is " size "M"}' 

结果:

size is 1495034M

案例五

统计/etc/passwd的账户总人数

bash 复制代码
awk  -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "Line is " count}' passwd

结果:

Line is 22

案例六

统计UID大于100的用户名

bash 复制代码
awk -F ':' 'BEGIN{count=0}{if($3>100) name[count++]=$1}END{for(i=0;i<count;i++){ print i,name[i]}}' passwd

有点蒙b...

案例七

统计netstat -anp状态下为LISTEN和OCONNECTED的链接数量

bash 复制代码
netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum) {print i,sum[i]}}'

结果:

LISTEN 3
CONNECTED 42 

祝你学习愉快~~~

相关推荐
Karoku0667 分钟前
【docker集群应用】Docker网络与资源控制
运维·数据库·docker·容器
梦游钓鱼13 分钟前
pyshark安装使用,ubuntu:20.04
linux·运维·ubuntu
火龙谷16 分钟前
CentOS7将yum源更换为国内源教程
linux·centos
战族狼魂40 分钟前
CentOS 上安装各种应用的命令行总结
linux·运维·centos
学Linux的语莫1 小时前
ansible变量
linux·运维·服务器·ansible
北京迅为1 小时前
【北京迅为】iTOP-4412全能版使用手册-第十二章 Linux系统编程简介
linux·嵌入式硬件·4412开发板
清源妙木真菌1 小时前
Linux:进程控制
linux
爱吃喵的鲤鱼1 小时前
Linux——文件系统清尾、动静态库
linux·运维·服务器
最数据2 小时前
Linux或者Docker中时区查询和修改(差8小时问题)
linux·运维·服务器·docker·.net
皓月盈江2 小时前
Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱
linux·服务器·wordpress·无法访问wordpess后台·打开网站页面错乱·linux宝塔面板·wordpress更换服务器