目录
一、AWK工具介绍
1.1AWK命令的基本格式
1.2AWK工作原理
1.3常见的内建变量(可直接用)
二、实例
2.1打印文本内容
案例1:打印磁盘已经使用情况
案例2:打印字符串
案例3:打印字符串确定文件有多少行
2.2根据$n提取字段
案例1:提取ip地址
案例2:提取mac地址
2.3根据选项-F指定分隔符
案例1:打印/etc/passwd所有用户名
案例2:打印多列内容
案例3:打印磁盘已经使用情况,去除%
案例4:取出文本中的ip地址及时间
案例5:取出文本中的主机并放回
2.4根据关键字提取所在行
案例1:提取/etc/passwd 以root开头的行
案例2:提取/etc/passwd root所在的行
案例3:提取/etc/passwd nologin结尾的行
案例4:提取ip地址
2.5 使用BEGIN输出包含指定字符的行并统计有多行
2.6 FS∶ 列分割符提取列
2.7NF∶
案例1:当前处理的行的字段个数
案例2:打印出每行最后一个字段
案例3:打印出每行倒数第二个字段
2.8 NR:
案例1: 当前处理的行的行号
案例2:NR==n代表行号等于什么
案例3:NR%2==0取偶数行
案例4:NR%2==1取奇数行
案例5:NR==1,NR==4取区间行
案例5:取UID数值范围$n>1000
三、牛刀小试
1.统计/etc/fstab文件中每个文件系统类型出现的次数
2.提取主机名并放入原文件
3.统计/etc/fstab文件中每个单词出现的次数
4.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
一、AWK工具介绍
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
可以在无交互的模式下实现复杂的文本操作
相较于sed常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。
1.1AWK命令的基本格式
awk [选项] ‘模式条件{操作}’ 文件1 文件2...
awk -f|-v 脚本文件 文件1 文件.....
1.2AWK工作原理
前面提到sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或tab键。awk 执行结果可以通过print的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、"“表示"或”、"!“表示"非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
awk后面接两个单引号并加上大括号{ }来设置想要对数据进行的处理操作,awk可以处理后续接的文件,也可以读取来自前个命令的标准输。
1.3常见的内建变量(可直接用)
FS∶ 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF∶ 当前处理的行的字段个数。
NR∶ 当前处理的行的行号(序数)。
$0∶当前处理的行的整行内容。
$n∶ 当前处理行的第n个字段(第n列)。
FILENAME∶ 被处理的文件名。
RS∶ 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
二、实例
2.1打印文本内容
-
awk可以将自动将多个空格压缩成一个空格
-
打印字符串需要加双引号
案例1:打印磁盘已经使用情况
[root@localhost ~]#df |awk '{print $5}'
已用%
8%
0%
0%
3%
0%
18%
1%
1%
100%
案例2:打印字符串
[root@localhost ~]#awk '{print "hello"}'
1
hello
2
hello
3
hello
案例3:打印字符串确定文件有多少行
[root@localhost ~]#awk '{print "hello"}' /etc/fstab
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
[root@localhost ~]#awk '{print "hello"}' /etc/fstab |wc -l
12
[root@localhost ~]#cat /etc/fstab |wc -l
12
2.2根据$n提取字段
案例1:提取ip地址
$n,代表提取第几列
#法一
[root@localhost ~]#ifconfig ens33|sed -n '2p'|awk '{print $2}'
192.168.59.102
案例2:提取mac地址
[root@localhost ~]#ifconfig ens33|sed -n '4p' |awk '{print $2}'
00:0c:29:3e:22:fe
2.3根据选项-F指定分隔符
案例1:打印/etc/passwd所有用户名
[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1}'
root
bin
daemon
adm
lp
sync
###########后面省略######
案例2:打印多列内容
打印时逗号可以表示空格,如果使用“:”或者“+”,需要将特殊符号加上双引号当成字符串打印
=[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1,$2}'
root x
bin x
daemon x
###########后面省略######[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1":"$2}'
root:x
bin:x
daemon:x
adm:x
###########后面省略######[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1"+"$2}'
root+x
bin+x
daemon+x
###########后面省略######
案例3:打印磁盘已经使用情况,去除%
#使用两条awk命令
[root@localhost ~]#df|awk '{print $5}'|awk -F% '{print $1}'
已用
8
0
0
3
0
18
1
1
100#使用一次awk命令
[root@localhost ~]#df|awk -F"[ %]+" '{print $5}'
已用
8
0
0
3
0
18
1
1
100
##也可以使用( |%)代表或者
[root@localhost ~]#df|awk -F"( |%)+" '{print $5}'
已用
8
0
0
3
0
18
1
1
100
案例4:取出文本中的ip地址及时间
####文本内容####
[root@localhost opt]#vim test.txt 58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?
doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"
""sendfileo##提取
[root@localhost opt]#cat test.txt |sed '2d'|awk -F"[[ ]" '{print $5"\t"$1}'
09/Jun/2020:03:42:43 58.87.87.99
09/Jun/2020:03:42:43 128.14.209.154
09/Jun/2020:03:43:11 64.90.40.100""sendfileo
案例5:取出文本中的主机并放回
[root@localhost opt]#vim host.txt 1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com
2.4根据关键字提取所在行
案例1:提取/etc/passwd 以root开头的行
[root@localhost opt]#cat passwd |awk -F":" '/^root/{print}'
root:x:0:0:root:/root:/bin/bash
案例2:提取/etc/passwd root所在的行
案例3:提取/etc/passwd nologin结尾的行
[root@localhost opt]#cat passwd |awk -F":" '/nologin$/{print}'
bin:x:1:1:bin:/bin:/sbin/nologin
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
###########后面省略########如果提取/sbin/nologin,则需要\转义/
[root@localhost opt]#cat passwd |awk -F":" '/\/sbin\/nologin$/{print}'
bin:x:1:1:bin:/bin:/sbin/nologin
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
###########后面省略######
案例4:提取ip地址
[root@localhost opt]#ifconfig ens33|awk '/netmask/{print $2}'
192.168.59.102
2.5 使用BEGIN输出包含指定字符的行并统计有多行
-
BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;
-
awk再处理指定的文本,之后再执行END模式中指定的动作;
-
END{ } 语句块中,往往会放入打印结果等语句。
#先定义变量x,表示执行多少次
[root@localhost opt]#awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
yxp:x:1000:1000:yxp:/home/yxp:/bin/bash
42
2.6 FS∶ 列分割符提取列
[root@localhost opt]#awk -v FS=: '{print $1FS$3}' /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4
###########后面省略######
2.7NF∶
案例1:当前处理的行的字段个数
[root@localhost opt]#cat /etc/passwd |awk -F: '{print NF}'
7
7
7
###########后面省略######
案例2:打印出每行最后一个字段
[root@localhost opt]#cat /etc/passwd |awk -F: '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
###########后面省略######
案例3:打印出每行倒数第二个字段
[root@localhost opt]#cat /etc/passwd |awk -F: '{print $(NF-1)}'
/root
/bin
/sbin
/var/adm[root@localhost opt]#df|awk '{print $(NF-1)}'
已用%
8%
0%
0%
3%
0%
18%
1%
1%
100%
2.8 NR:
案例1: 当前处理的行的行号
#NR写在后面则在后面显示行号
[root@localhost opt]#awk -F":" '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6
shutdown 7
halt 8#可以用制表符
[root@localhost opt]#awk -F":" '{print $1"\t"NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5#NR写在前面则在前面显示行号
[root@localhost opt]#awk -F":" '{print NR"\t"$1}' /etc/passwd
1 root
2 bin
3 daemon
4 adm
5 lp
案例2:NR==n代表行号等于什么
[root@localhost opt]#awk -F: 'NR==2 {print $1}' /etc/passwd
bin
案例3:NR%2==0取偶数行
[root@localhost opt]#awk -F: 'NR%2==0 {print $1}' /etc/passwd
bin
adm
sync
halt
operator
ftp
systemd-network
polkitd
案例4:NR%2==1取奇数行
[root@localhost opt]#awk -F: 'NR%2==1 {print $1}' /etc/passwd
root
daemon
lp
shutdown
mail
games
nobody
案例5:NR==1,NR==4取区间行
[root@localhost opt]#awk -F: 'NR==1,NR==4 {print $1}' /etc/passwd
root
bin
daemon
adm
案例5:取UID数值范围$n>1000
#取uid大于1000的行
[root@localhost opt]#awk -F: '$3>1000 {print}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin#取uid大于等于1000的行
[root@localhost opt]#awk -F: '$3>=1000 {print}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
yxp:x:1000:1000:yxp:/home/yxp:/bin/bash
三、牛刀小试
1.统计/etc/fstab文件中每个文件系统类型出现的次数
[root@localhost opt]#cat /etc/fstab |awk '/[^#]/{print}'
# /etc/fstab
# Created by anaconda on Sat Sep 4 02:48:23 2021
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/centos-root / xfs defaults 0 0
UUID=183ca7c7-1989-4f43-9e81-d2676192f5a4 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0[root@localhost opt]#cat /etc/fstab |awk '/^[^#]/{print}'|awk '{print $3}'|sort |uniq -c1 swap3 xfs
2.提取主机名并放入原文件
[root@localhost opt]#vim text.txthttp://mail.kgc.com/index.html
http://www.kgc.com/test.html
http://study.kgc.com/index.html
http://blog.kgc.com/index.html
http://www.kgc.com/images/logo.jpg
http://blog.kgc.com/20080102.html
http://www.kgc.com/images/kgc.jpg[root@localhost opt]#cat text.txt |awk -F"[. /]" '{print $3}' >>text.txt
[root@localhost opt]#cat text.txt
http://mail.kgc.com/index.html
http://www.kgc.com/test.html
http://study.kgc.com/index.html
http://blog.kgc.com/index.html
http://www.kgc.com/images/logo.jpg
http://blog.kgc.com/20080102.html
http://www.kgc.com/images/kgc.jpg
mail
www
study
blog
www
blog
www
3.统计/etc/fstab文件中每个单词出现的次数
[root@localhost opt]#grep -Eo "\b[[:alpha:]]+\b" /etc/fstab |sort|uniq -c|sort1 Accessible1 anaconda1 and1 are1 blkid1 boot1 Created1 disk1 etc1 filesystems1 findfs1 for1 info1 maintained1 man1 more1 mount1 on1 or1 pages1 reference1 root1 Sat1 See1 Sep1 under1 UUID2 by2 fstab2 home3 centos3 mapper3 swap3 xfs4 defaults4 dev
4.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
[root@localhost opt]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|grep -E -o "[0-9]+"
05
9
7
3