一.awk工具介绍
作用:
能够按照特定的条件在文件中搜索数据,按照特定的格式进行显示。
$0代表当前处理的整行内容,$1代表第一个数据
awk在处理文本数据的时候也是逐行处理数据
工作流程:默认按照空白字符分割文本,将文本分成多部分,在awk内部有类似$1变量用于代表第一部分内容,$2代笔第二部分,依次类推,$0表示整行文本
逐行处理工具。
-F选项:用来指定分割符号
1.awk使用格式
这个使用格式的意思就是我要使用awk如何显示文件中符合条件的内容。
即使用awk工具使用什么样的格式和操作去显示文件中的内容。
符合什么条件的一行数据,如何显示一行符合条件的数据。
pattern:特定的条件,来从文件中过滤数据。【这个如果不写,就表示着awk工具要去处理文件中的每一行数据。】
action:特定的格式,将过滤出的数据以特定的格式来显示数据。
(print)
(printf)
都是显示的意思,就是使用格式有所不同。
二.action 操作
1.print显示操作
如上图所示,就是将/etc/passwd文件中的第二行通过p参数显示到显示器上,然后就是使用awk工具对符合条件的文件行数,提取第三个数据,和第6个数据的操作,$0表示整行文件内容。
如上图所示,输出的内容默认是以空格来进行数据的分割的。
[root@es-master ~]# sed -n '1p' /etc/passwd | awk -F: '{print $3","$6}'
如上所示,如果想按照英文逗号分隔数据,就还要使用英文引号将两个$3和$6给引起来。
如上图所示,第一行输出第六个数据,第二行同样输出第六个数据。
然后可以根据我们的需要在大括号中去写我们需要的内容,
不管是中文的内容还是英文的内容,但凡是自己想输出的内容,都需要用引号将内容引起来。
然后可以根据我们的需要在大括号中去写我们需要的内容,
不管是中文的内容还是英文的内容,但凡是自己想输出的内容,都需要用引号将内容引起来。并且要和其他的内容用英文逗号给隔开。
如上图所示,这是使用awk工具去将我们想要的数据进行标识的操作。
如上图所示,这是使用awk工具通过自定义输出的字符串数据,然后将输出的字符串数据交给bash去执行的统一卸载软件的操作。
如上图所示,这也是通过awk工具将字符串数据的输出进行自定义,同时将自定义的字符串数据交给bash去执行。
2.printf 格式化输出内容(支持我们给输出的内容设置格式,主要目的就是为了让输出的内容更整齐一些。)
使用格式:
printf “格式”,内容1,内容2,内容3
格式的写法:
1.占位符{用来给数据占位置的符号}
%s 字符串数据
%8s标识以右对齐的方式显示字符串数据
%-8s标识以左对齐的方式显示字符串数据
%d 整数
%f 浮点数,小数
如上图所示,就是printf的一个基本使用,即使用%s来重定义数据的输出格式。
如上图所示,这是在awk工具中使用%9s进行右对齐的方式,来格式化字符串的输出
在awk工具中使用%-9s进行左对齐的方式,来格式化字符串的输出。
如上图所示,在这个awk工具的使用中默认以在8个字符的范围之内以右对齐的方式显示字符,
如上图所示,这是在10个字符的范围之内以左对齐的方式显示字符。
在输出结果上看print和printf从输出结果上看有什么区别?
如上图所示,在awk工具中使用print输出结果之后会默认有一个换行,但是printf输出结果之后默认不会有一个换行。
如上图所示,当使用printf输出多行内容的时候,需要注意手动添加换行符\n
如上图所示,手动添加换行符\n
如上图所示,是使用df -hT命令的使用结果。
如上图所示,是分别使用print和printf输出字符串数据的比较。
3.在Linux操作系统中的awk工具中print和printf的主要区别是什么?
三.awk变量的使用
典型:
自定义变量
内置变量(awk内部自带的内置变量)
自定义变量
方法1:
-v 变量名称=值
调用变量的时候,直接写变量名称就可以了。
如上图所示,是使用awk自定义变量并使用变量的一个演示。
如上图所示,BEGIN的意思是awk在真正读取文件内容之前做什么事情。
即在真正读取文件内容之前打印输出字符串hello 并且读取输出变量name中的值。
BEGIN{}这里的是awk工具中的一个特殊的模式,含义是在真正读取文件内容之前做什么操作。
完整的应该是BEGIN{}{action}其中BEGIN{}含义是在真正读取文件内容之前做什么操作。
而{action}就是对文件内容进行的操作了。
如上图所示,这个表示的是在真正读取文件内容之前,所做的操作是打印输出hello 引用变量name的变量值并且打印输出,打印输出My Age is ,引用变量age的值并且打印输出。
方法2:
在BEGIN{}模式中定义
如上图所示,这是在awk工具的BEGIN{}模式中自定义变量的一种方式。
2.内置变量中最常用的就是NR表示行号,还有NF表示一行文本数据被分隔成几段。
1)FS,OFS
FS变量:
作用与-F选项一致,
awk读取文本时指定行分隔符,默认是空白。
如上图所示,-F选型和FS变量的作用是一样的都是读取文本的时候指定行分隔符。用哪个都行。
OFS变量
指定awk在输出多行内容时的分隔符,默认是空白。
如上图所示,这是在指定在使用awk工具输出多行内容的时候,中间的分隔符是什么。
2)NR,FNR
记录awk读取文本时的行号的。主要应用于在awk工具处理多文件内容时候。
区别:NR变量,awk在处理多个文件时,所有文件的行号是统一记录的。
FNR变量,awk在处理多个文件时,所有文件的行号是单独记录的。
如上图所示,这是在使用awk工具中内置变量NR与FNR时候的区别,当使用这两个内置变量的时候去处理单个文件的时候,其表现出来的结果是一样的,但是当使用这两个内置变量去处理多个文件的时候,其表现的结果就是不一样的了,NR是将多个文件中的行数,进行一个统一记录,最后的结果是两个文件中文件内容的总行数,FNR是将多个文件中的行数单独记录。
如上图所示,我现在有一个需求要求将文件中以\开头的文件内容都显示到屏幕上,并且显示出这些文件内容的行号。
如上图所示,这是将文件中的第三行内容显示到屏幕上。
从处理文本数据的三剑客:grep,sed,awk,熟练使用sed的比只使用grep的厉害,熟练使用awk的比只使用grep的更厉害。
3)NF
记录awk分隔文本时,被分割的段数。
如上图所示,这个NF变量记录的是文本数据中的一行数据被awk工具所分隔的段数。
如上图所示,这个NF变量记录的是文本数据中的一行数据被awk工具所分隔的段数。
如上图所示,NF还可以作为变量去储存awk工具分隔一行文本数据中的最后一段数据。
此时在awk工具中使用$NF的方式还可以去调用这个变量的值。也就是文本数据中的最后一段数据。
如上图所示,这里使用NF变量不仅可以知道这个文件中每一行,被分割成几段数据,还可以直接通过变量NF来获取到这个文件中每一行文本数据的最后一段数据,作为NF的变量值。
在awk中需要使用$符号才可以调用变量NF的值。
awk的使用格式来说模式的写法,这个模式也可以称为awk的条件。
四.pattern的写法即模式(条件)的写法
使用awk工具的时候模式可以不写但是此时awk默认就是处理的文件中的所有内容。
1.表达式
需求:我现在想列出uid小于等于10的用户的用户名
如上图所示,实现具体需求。‘
需求:获取所有的系统用户
如上图所示,实现具体需求。
需求:我想列出系统磁盘中以/开头的磁盘分区,并且列出磁盘分区使用率大于百分之25的磁盘分区名称。
如上图所示,实现具体需求。
需求:过滤出shell程序为/sbin/nologin的用户名
如上图所示,这两条命令可以实现相同的结果。
2./正则表达式/
如上图所示,想要获取当前操作系统中以tcp开头的协议,可以使用grep "^tcp"这样就能过滤出以tcp开头的端口。也可以使用sed '1,2d'这样就是把前面netstat -antp的结果交给sed '1,2d'来删除前两行。
如上图所示,也可以使用awk工具此时使用^tcp来过滤出所有以tcp开头的行,并将这些行交给print 去打印输出命令本身,此时也可以实现打印输出以tcp协议启动的端口。
接下来使用awk工具去获取r或者s开头的用户名
如上图所示,就是使用awk工具去获取/etc/passwd文件中所有以r或者s开头的用户名
3./正则表达式1/,/正则表达式2/
使用awk工具获取文件中正则表达式1与正则表达式2之间的所有数据。
如上图所示,这就表示在日志文件获取我们需求时间段中的所有日志信息。
4.BEGIN{}{action}【其中BEGIN表示的意思是让awk在真正处理文件内容之前,先干什么事。】
比如说在处理文件内容之前打印一个表头。
如上图所示,是在awk处理文件内容之前去进行一个打印表头的操作。
5.END{}文件所有数据处理完毕后执行的操作
如上图所示,这就是END{}即在awk工具处理完文件中所有数据之后才会执行的操作。
五.action操作--逻辑控制语句
1.条件判断
语法:
if(条件) {条件为真执行的操作}
if(条件){条件为真执行的操作} else{条件为假执行的操作}
if(条件) {条件为真执行的操作} else if(条件){条件为真执行的操作}
需求:判断用户是管理员还是普通用户,如果是管理员就打印输出管理员,如果是普通用户就打印输出普通用户。
如上图所示,这是在awk工具中使用if判断的示例。
需求:统计我用户中的shell是/bin/bash的有几个,shell是/sbin/nologin的有几个
基本思路是定义两个变量,如果shell是/bin/bash。就对应的变量中的数值加一,如果是shell是/sbin/nologin,就对应的变量中的数值加一。
这个需求使用脚本中的循环没有问题,也可以使用awk搞定。
如上图所示,这就是使用awk工具中的if判断实现的。
需求:显示系统中磁盘使用率大于百分之20的磁盘的信息。
如上图所示,这是使用awk工具中的条件判断实现的列出系统磁盘中使用率大于百分之20的磁盘信息。
2.for循环
如上图所示,请问awk循环的目的是否就是依次处理文件中符合条件的每一行的内容?
这个说法是错误的,因为awk工具本身就是一个依次处理符合条件的每一行数据的工具。
awk循环的目的,就是处理一行数据中分隔出来的每一段数据
语法:for(变量的定义:循环条件;改变循环条件真假的语句){执行的操作}
这就是一个执行10次的循环,这个就是for循环的一个基本语法。
break直接结束循环
continue直接跳出本次循环,执行下一次循环。
awk中提供的函数length()这个的意思是统计字符串的字符个数。
如上图所示,结合着awk本身的length()函数再加上for循环的工具去依次处理一行数据的每一段内容。将符合条件的一段数据内容进行输出。
如上图所示,这是将文件中符合条件的一行数据中的一段数据给输出打印。也就是说这里的循环操作是去处理文件内容中的每一段数据,知道将所有符合条件的文件中的每一段数据都打印出来之后,循环结束。
六.awk数组的使用
定义:开辟一段连续的内存空间,可以保存多个数据。
在shell程序中的数组中元素的下标默认是从0开始,即数组中第一个元素的下标是0
在awk工具中对于在awk工具中使用的数组,数组中的元素的下标是从1开始的。即awk数组中的第一个元素的下标是1.
1.在awk中定义数组
如上图所示,这就是在awk工具中定义了一个数组·,这个数组名称是test,这个test数组中第一个元素是10.1.1.1第二个元素是10.1.1.2第三个元素是10.1.1.3
2.获取单个数据
如上图所示,这是如何在一个数组中获取数据的操作,即使用print 数组名称[下标]
当你试图从数组中获取一个不存在数据的时候,会获得一个空值。
3.获取数组中的所有数据可以通过for循环,来遍历这个数组,从而拿到这个数组中所有的数据
如上图所示,这是使用for循环来遍历数组中所有元素的方式,来获取数组中所有的值,
这里也可以使用length(test)来获取这个数组中元素的个数。
4.awk中的数组支持使用任何数据来作为下标来使用。
如上图所示,在awk中的数组中可以使用任何数据来作为元素的下标来使用。
5.遍历数组
如上图所示,这是面对awk数组中,元素下标不是单纯数组的情况,可以在for循环中使用for (变量名 in 数组名) 来获取数组中元素的下标,但是想要输出数组中元素的值,就需要使用print test[i]来输出打印awk数组test中的元素的值。
如上图所示,这是实现需求,打印输出数组中每个用户的姓名和住址的操作。
使用awk中的数组主要就是使用awk中数组下标可以是任何数据这样一个特性。
6.awk数组应用
1)统计各shell的次数
下标就是shell名,这个下标对应的数字就是这个下标出现的次数。
如上图所示,这个就是实现需求即实现统计各个shell程序出现的次数。
如上图所示,的这个awk命令可以用来统计文件中各段数据的出现次数。
即每一行文件内容就是一个数组,每一行数据中的统计数据为下标,以统计数据的出现次数为下标对应的元素。当这个统计数据出现一次的时候,这个下标对应的元素就加一。
2)统计tcp协议的各状态的次数
即每一行文件内容就是一个数组,每一行数据中的统计数据为下标,以统计数据的出现次数为下标对应的元素。当这个统计数据出现一次的时候,这个下标对应的元素就加一。
3)统计web日志的UV量。
不同的服务,都有属于自己的访问日志,这些访问日志记录着哪些客户端什么时间访问过我。
这个访问日志中有两个指标,是运维必须要会统计的。
UV即用户访问量即统计服务访问日志中各个客户端IP地址出现的次数,就是用户访问量。
PV即页面访问量
如上图所示,这就是阿帕奇服务的访问日志,中的信息。
如上图所示,这就是客户端访问日志中的内容。
具体思路就是使用awk工具来进行切割每一行数据,将每一行数据的IP地址作为awk数组中的下标,将客户端IP地址出现的次数作为这个数组中元素下标所对应的元素。
如上图所示,这个结果就是用户访问量,就是这个服务的UV量。
如上图所示,这是将统计结果进行排序。目的是更加直观的看出这个服务的UV量。
如上图所示,这是在查看这个httpd服务的访问日志的最后10行内容。
如上图所示,这就是这个httpd服务的PV量,
标签:awk,数组,使用,所示,如上图,工具,数据 From: https://blog.csdn.net/ZHX2285/article/details/143097919