awk工具的主要作用在显示数据上。

devtools/2024/10/23 6:18:27/

一.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量,


http://www.ppmy.cn/devtools/128082.html

相关文章

虚拟机(VMwara Workstation17)保姆级别的安装(附软件获取途径)

文章目录 一、虚拟机的作用二、虚拟机的获取三、虚拟机的安装步骤四、总结 一、虚拟机的作用 压根不需要给自己的电脑重装系统,就可以使用Linux系统。简单来说就是虚拟出一个计算机,安装Linux系统,便于学习和工作 关于虚拟机的介绍&#xf…

Turn-it:优化线材重构雕塑制造

🐨文章摘要abstract 电线雕塑在工业应用和日常生活中都很重要。 本文提出了一种新的制造策略,通过调整目标形状以适应电线弯曲机,然后由人工将其弯曲回目标形状。(机器弯曲人工弯曲) 该方法通过两阶段弯曲策略实现&a…

uniapp学习(005-3 详解Part.3)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第48p-第p51的内容 文章目录 页面和路由API1. 使用navigator标签跳转2. 使用js代码块进行跳转tabBar页面无法直…

linux命令基础

shell linux优势: 一切都是文件轻量级 系统小型免费不以后缀名为主 Linux命令基础 shell是Linux系统中后台运行的一种特殊程序也可以理解成一种特殊的软件,提供了用户与内核进行交互操作的一种接口。shell是将人类使用的高级语言转换成计算机的二进制…

python+Mosh网课笔记13 使用Python进行机器学习

太久没写python代码了,学机器学习重新拾起python,笔记比较简陋。 参考:mosh python网课 目录 一、通常的步骤 二、库和工具 三、环境 四、导入数据集 五、准备数据 六、预测-利用决策树 七、衡量模型的准确性 八、模型持久性 1. 保…

【ShuQiHere】深入解析数字电路中的锁存器与触发器

深入解析数字电路中的锁存器与触发器 🤖🔌 在数字电路设计中,**锁存器(Latch)和触发器(Flip-Flop)**是实现时序逻辑的基本元件。它们能够存储状态,是构建复杂数字系统的关键。本文将…

《云计算网络技术与应用》实训6-1:配置KVM虚拟机使用NAT网络

任务1、计算节点基础环境准备 1. 使用VMware安装CentOS 7虚拟机,安装时记得开启CPU虚拟化,命名为“KVMC6”。 2. (网卡配置和之前的一样,都用100网段)网关设置为192.168.100.1,地址段为192.168.100.10-25…

vue 刷新组件

vue 刷新组件 在Vue中,如果你需要强制刷新一个组件,可以通过改变组件的key属性来实现。当key改变时,Vue会认为这是一个全新的组件,并且会销毁旧的组件实例,创建一个新的实例。 以下是一个简单的例子: &l…