Shell脚本⑦awk

目录

一.awk概述

1.awk介绍

2.基本格式

3.工作原理

4.常见的内建变量

二.awk基本操作

1.打印文本内容

(1)打印磁盘使用情况

(2)打印字符串

(3)打印字符串确定文件有多少行

2.根据$n以及NR提取字段

3.根据选项指定分隔符(-F)

(1)打印所有用户名

(2)打印多列内容

(3)打印磁盘已经使用情况(去除%)

(4)取出文本中的IP地址及时间

(5)取出文本中的主机并返回

4.根据关键字提取所在行

(1)提取以root开头的行

(2)提取root所在行

(3)提取nologin结尾的行

5.使用BEGIN输入包含指定字符

6.FS:指定每行文本的字段分隔符,默认为空格或制表符,与-F相同

7.NF:处理当前行的整行内容

(1)当前处理行的字段个数

(2)打印出每行最后一个字段

(3)打印出每行倒数第二字段

8.NR:当前处理行的行号

(1)当前处理行的行号

(2)NR==n代表行号等于什么

(3)NR%2==0取偶数行

(4)NR%2==1取奇数行

(5)NR==1,NR==4取区间行

(6)取UID数值范围$n>1000

三.试题练习

1.统计/etc/fstab文件中每个文件系统类型出现的次数

2. 统计/etc/fstab文件中每个单词出现的次数

​编辑

3.将某日志文件访问用户的IP地址,在第三列冒号隔开,统计出访问量前十的IP地址

4.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字


一.awk概述

1.awk介绍

awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK

2.基本格式

awk [选项] ‘模式条件{操作}’ 文件1 文件2...
awk -f|-v 脚本文件 文件1 文件.....

3.工作原理

前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

4.常见的内建变量

FS 列分隔符。指定每行文本的字段分隔符,默认为空格或制表位。与“-F”作用相同
NF 当前处理的行的字段个数
NR 当前处理的行的行号
$0 当前处理的行的整行内容
$n 当前处理行的第n个字段
FILENAME 被处理的文件名
RS 行分隔符
$NF 最后一段
$(NF-1) 倒数第二段

二.awk基本操作

1.打印文本内容

  • awk可以将自动将多个空格压缩成一个空格

  • 打印字符串需要加双引号

(1)打印磁盘使用情况
df |awk '{print $5}'

Shell脚本⑦awk_第1张图片

(2)打印字符串
awk '{print "hello"}'

Shell脚本⑦awk_第2张图片

(3)打印字符串确定文件有多少行
awk '{print "hello"}' /etc/fstab 
 
awk '{print "hello"}' /etc/fstab |wc -l
 
cat /etc/fstab |wc -l

Shell脚本⑦awk_第3张图片

2.根据$n以及NR提取字段

ifconfig ens33|sed -n '2p'|awk '{print $2}'

ifconfig ens33 |awk 'NR==2{print $2}'

注意:$n代表提取第几列

Shell脚本⑦awk_第4张图片

3.根据选项指定分隔符(-F)

(1)打印所有用户名
cat /etc/passwd|awk -F":" '{print $1}'
或
cat /etc/passwd|awk -F: '{print $1}'

Shell脚本⑦awk_第5张图片

(2)打印多列内容
cat /etc/passwd|awk -F":" '{print $1,$2}'
 
cat /etc/passwd|awk -F":" '{print $1":"$2}'
 
cat /etc/passwd|awk -F":" '{print $1"+"$2}'

Shell脚本⑦awk_第6张图片

Shell脚本⑦awk_第7张图片

Shell脚本⑦awk_第8张图片

(3)打印磁盘已经使用情况(去除%)
#使用两条awk命令
df|awk '{print $5}'|awk -F% '{print $1}'
 
#使用一次awk命令
df|awk -F"[ %]+" '{print $5}'
 
##也可以使用( |%)代表或者
df|awk -F"( |%)+" '{print $5}'

Shell脚本⑦awk_第9张图片

(4)取出文本中的IP地址及时间
##文本内容##
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
 
 
##提取##
cat test.txt |sed '2d'|awk -F"[[ ]"  '{print $5"\t"$1}'

Shell脚本⑦awk_第10张图片

(5)取出文本中的主机并返回
##文本内容##
vim host.txt 
 
1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com
 
##提取##
cat host.txt |awk -F "[. ]" '{print $2}' >>host.txt

Shell脚本⑦awk_第11张图片

4.根据关键字提取所在行

(1)提取以root开头的行
cat /etc/passwd |awk -F":" '/^root/{print}' 

(2)提取root所在行
cat /etc/passwd |awk -F: '/root/{print}'

(3)提取nologin结尾的行
cat /etc/passwd |awk -F":" '/nologin$/{print}' 
 
##如果提取/sbin/nologin,则需要\转义/
cat /etc/passwd |awk -F":" '/\/sbin\/nologin$/{print}' 

Shell脚本⑦awk_第12张图片

Shell脚本⑦awk_第13张图片

5.使用BEGIN输入包含指定字符

  • BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;

  • awk再处理指定的文本,之后再执行END模式中指定的动作;

  • END{ } 语句块中,往往会放入打印结果等语句。

#先定义变量x,表示执行多少次
awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd

Shell脚本⑦awk_第14张图片

6.FS:指定每行文本的字段分隔符,默认为空格或制表符,与-F相同

Shell脚本⑦awk_第15张图片

7.NF:处理当前行的整行内容

(1)当前处理行的字段个数

Shell脚本⑦awk_第16张图片

(2)打印出每行最后一个字段
cat /etc/passwd |awk -F: '{print $NF}'

Shell脚本⑦awk_第17张图片

(3)打印出每行倒数第二字段
cat /etc/passwd |awk -F: '{print $(NF-1)}'

Shell脚本⑦awk_第18张图片

df|awk '{print $(NF-1)}'

Shell脚本⑦awk_第19张图片

8.NR:当前处理行的行号

(1)当前处理行的行号
#NR写在后面则在后面显示行号
#awk  -F: '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6
shutdown 7
halt 8
 
#可以用制表符
awk  -F: '{print $1"\t"NR}' /etc/passwd
root	1
bin  	2
daemon	3
adm  	4
lp	    5
 
#NR写在前面则在前面显示行号
awk  -F: '{print NR"\t"$1}' /etc/passwd
1	root
2	bin
3	daemon
4	adm
5	lp

Shell脚本⑦awk_第20张图片

Shell脚本⑦awk_第21张图片

Shell脚本⑦awk_第22张图片

(2)NR==n代表行号等于什么
awk -F: 'NR==2 {print $1}' /etc/passwd

(3)NR%2==0取偶数行
awk -F: 'NR%2==0 {print $1}' /etc/passwd

Shell脚本⑦awk_第23张图片

(4)NR%2==1取奇数行
awk -F: 'NR%2==1 {print $1}' /etc/passwd

Shell脚本⑦awk_第24张图片

(5)NR==1,NR==4取区间行
awk -F: 'NR==1,NR==4 {print $1}' /etc/passwd

Shell脚本⑦awk_第25张图片

(6)取UID数值范围$n>1000
#取uid大于1000的行
awk -F: '$3>1000 {print}' /etc/passwd
 
 
#取uid大于等于1000的行
awk -F: '$3>=1000 {print}' /etc/passwd

Shell脚本⑦awk_第26张图片

三.试题练习

1.统计/etc/fstab文件中每个文件系统类型出现的次数

cat /etc/fstab |awk '/^[^#]/{print}'|awk '{print $3}'|sort |uniq -c 

Shell脚本⑦awk_第27张图片

2. 统计/etc/fstab文件中每个单词出现的次数

grep -Eo "\b[[:alpha:]]+\b" /etc/fstab |sort|uniq -c|sort

Shell脚本⑦awk_第28张图片

3.将某日志文件访问用户的IP地址,在第三列冒号隔开,统计出访问量前十的IP地址

cat log.txt |awk -F: '{print $3}' |sort |uniq -c |sort -rn |head

Shell脚本⑦awk_第29张图片

4.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|grep -E -o "[0-9]+"

Shell脚本⑦awk_第30张图片

你可能感兴趣的:(服务器,linux,运维)