Linux系统三剑客之awk命令详解(三)

Linux系统三剑客之grep和正则表达式的介绍(一)-CSDN博客

Linux系统三剑客之sed命令详解(二)-CSDN博客

接上文

目录

1.作用

2.语法

3.变量

4.选项

5.模式

​编辑

6.动作

7.实例


1.作用

awk是一个强大的文本分析工具,其主要工作原理就是将文件内容逐行读取,按照分隔符进行切片,切成多个组成部分,然后将每片保存到内建的变量中。如果指定了模式的话,根据模式匹配是否处理此行内容,若此行文本符合模式,则按照动作处理文本。

以上介绍到了几个关键词,分别是模式和动作,具体意思会放在后面介绍 。

在上面的文本中,通过分隔符将文本内容切割成多个列,那么如果想获取某个列怎么办呢 ?就可以使用$加上第几列的数量就可以。具体如下:

  • $0 : 代表所有数据

  • $1 : 代表第一列

  • $2 : 代表第二列

  • $n : 代表第n列

需要注意的是,若切割出的第n列已经没有数据,你继续输出的话就输出了空行 。

 

awk早期就以在Unix上实现了,现在Linux上所使用的awk其实是gawk,也就是GUN awk,简称为gawk。而在Linux中所使用的是awk其实就是链接到了gawk中了。

2.语法
awk [options] 'Pattern {Action}' file
  • awk是固定的语法,在Linux下也可以使用gawk代替

  • 其中options为选项,在awk中支持的选项介绍具体见“选项”小结

  • 其中Pattern为模式,在awk中支持的模式介绍有见“模式”小结

  • 其中Action为要执行的命令,在awk中支持action介绍见"动作"小结

  • file为文本文件,需要注意的是awk读取的文件流不一定是要跟的这个file,也可以是通过管道输出的结果作为文件流。

 

3.变量

在介绍完awk的语法之后,我们有必要先了解下awk变量,因为无论是options还是Pattern,都会使用到变量。对于awk来说 ,主要包括内置变量和自定义变量两种。

  • 内置变量:变量名已经定义好了,一般情况下一会给一个默认值 ,当然我们也可以自定义变量的值 。

  • 自定义变量 : 用户自己去定义变量的名字和变量的值 。

变量的定义格式:var_name = value

内置变量

内置变量名含义
FS输入字段分隔符,默认为空白字符
OFS输出字段分隔符,默认为空白字符
RS输入记录分隔符(输入换行符),指定输入时的换行符
ORS输出记录分隔符(输出换行符),指定输出时的换行符
NF当前行的字段数(当前行被分隔符分割成了几段)
NR当前行的行号
FNR不同文件分别计数
FILENAME当前文件名
ARGV数组,保存的是命令行所给定的各参数
ARGCARGC数组的个数

变量使用也非常简单,直接使用变量名即可,具体如下:

自定义变量

自定义变量,简单来说就是用户自己定义的变量。在awk中有两种方式可以自定义变量。

方式1:使用-v参数,定义格式为:-v var_name = value .

方式2:在BEGIN模式中定义 。

以上的两种方式,目前还没有涉及到,故我们在下面内容中讲解 。

注意:定义变量最终的目的是要使用变量,那么在awk中怎么使用呢 ? 答案就是使用处直接写变量的名字就可以得到变量的值了 。那么变量一般会在哪使用呢 ? 在后面要讲解到的模式和动作都会用到 。

4.选项

所谓的选项,就是awk后面的options,一般都是通过减号(-) 加上一个英文字符组成,不同英文字符代表不同的意思 。在awk中支持的选项参数也有很多,放在方括号内([])代表这个选项是可选的。这里主要介绍最常用的。

 

  • -F : 指明用于分割内容的分隔符,若不加该参数,默认使用空格分割

  • -v : 自定义变量,具体格式为:var_name = value .

  • -f : 调用脚本。

-F 选项

以下是对-F参数的说明,在此案例中使用英文点(.)作为分隔符,通过分隔符将文本内容分隔成多个部分。

-v 选项

在上面我们介绍-v可以自定义变量,自定义变量时,变量名可以是内置变量也可以用户自己定义的变量名 ,具体定义方式如下:

 2)自己定义变量名进行定义

5.模式

所谓的模式,其实就是Pattern的部分,我们可以将模式理解为条件,在前面介绍到awk是逐行处理的,那怎么判断哪行该处理?哪行不该处理呢 ?答案就是这个模式,当匹配到的模式就是要处理的行,而不匹配的行就会被跳过。

另外,Pattern部分一定要放在引号当中,一般使用单引号引起来。一条awk指令可以包括0个模式或多个模式 ;如果后面有Action ,中间用空格隔开 。

Pattern主要包括以下几个部分:

  • BEGIN模式:初始化代码块,即开始处理文本前要执行的操作 。

  • END模式:收尾工作,即处理文本之后要执行的操作

  • 关系表达式模式 :相当于条件判断,满足条件的就会执行后面的‘动作’,而这里就支持各种运算符,如比较运算符,算数运算符等。

  • 空模式 :此模式会匹配文本的每一行,也就是每一行满足条件 。

  • 正则模式:通过正则进行匹配,匹配后的将会执行后面的动作 。

  • 行范围模式 :处理pattern1到pattern2之间(不包含pattern2) 。从pattern1匹配的行开始,到pattern2匹配的行结束 。

BEGIN模式

在前面介绍到,BEGIN模式是在处理文本之前的动作,在声明BEGIN时,后面括号内的语句就是BEGIN要执行的操作,

END模式

指定了处理完文本内容之后执行的操作,也就是进行一些收尾工作 。

 

空模式

空模式其实就是不设置任何模式或条件 ,也就是说对文本的每一行需要执行的处理就是空模式,简单来说空模式就是对行不做过滤处理,具体如下:

关系表达式模式

所谓的关系表达式模式是指包含表达式的模式,通过该表达式对文本行进行过滤处理 。

  • 表达式可以是比较表达式,也可以是赋值运算符

  • 同时支持的操作符也是

以下为比较表达式

awk支持的比较运算符还包括:

  • x < y : 小于

  • x <= y :小于等于

  • x > y : 大于

  • x >= y :大于等于

  • x == y : 等于

  • x != y :不等于

  • x ~ y : 匹配正则y为真

  • x !~ y : 不匹配正则y为真

以下为赋值表达式

awk支持的赋值运算符包括:

  • x = y : 赋值

  • x += y : 先加后赋值

  • x -= y : 先减后赋值

  • x *= y : 先乘后赋值

  • x /= y : 先除后赋值

  • x %= y :先取余后赋值

  • x^= y:先次方后赋值

  • x ** y : 先次方后赋值

  • x ++ :对x+1

  • x -- : 对x-1

支持的算数运算符:

  • x+y :加法

  • x-y :减法

  • x*y : 乘法

  • x/y : 除法

  • x%y :取余

  • x^y : 次方(效果和**一样)

  • x**y : 次方

支持布尔类型:

  • 非0值为true

  • 非空字符串为true

  • 其余为为false

支持的逻辑操作符:

  • x && y: 两者都满足返回true

  • x || y :一个满足返回true

  • ! x : x若返回假,则返回true

除了以上支持的各种运算符外,awk还支持函数调用,条件语句,循环语句

正则模式

所谓的正则模式,其实就是使用正则表达式作为的模式 。所以要想使用这个模式,我们就的熟悉正则表达式,如果你还是对正则表达式不太熟悉,可参考第一章的正则表达式。

使用正则表达式也有一定的规则,具体如下:

awk '/正则表达式/{Action}' file

行范围模式

行范围模式,是使用正则表达式来匹配两个关键字之间行的数据,如果这个关键字在文本中出现过多次,那么也会匹配出多次 。它的使用规则如下:

awk '/正则1/,/正则2/{Action}' file

6.动作

所谓的动作,就是Action 的部分,在Action部分主要包括如下几个部分。

 

在Action中,虽然看语法写的是一个Action,但是在括号内可以有多个执行语句 ;也可以直接编写多个Action动作 。  

  • print :打印语句

  • printf :同样为打印语句,但是可以进行格式化

  • 条件语句 :可以进行条件判断

  • 循环语句 :可以进行循环.

print语句

在上面已经多次使用到,使用print语句可以输出变量值,在这里就不再赘述 。

printf语句

和print语句类似,但是比print语句更加强大,它的主要作用是可以对文本进行格式化处理,其语法格式为:

 printf format,item1,item2 ...

  • format用于指定后面每个item的输出格式

  • format一般输入的是格式符+修饰符+一些字符组成的字符串(见下),同时需要用双引号引起来

  • fromat和item都需要用逗号隔开

  • printf语句不会自动换行,若要进行换行,需通过\n

格式符

  • %f : 显示为浮点数

  • %g,%G: 以科学数法或浮点形式显示数值

  • %s: 显示字符串

  • %u: 无符号整数

  • %%: 显示%号自身,相当于转义

修饰符

  • N : 显示宽度

  • - : 左对齐(默认为右对齐)

  • + : 显示数值符号

条件语句

如果学习过编程语言,都知道在编程语言中有if ...else语句 ,那么对于awk来说,也是支持if ... else 。在awk支持如下三种情况:

  • if(条件){执行语句1;执行语句2}

  • if(条件){执行语句1} else {执行语句2}

  • if(条件1){执行语句1} else if(条件2){执行语句2} else{执行语句3}

对于以上代码做个简单说明:

  • 第一种情况:如果条件为真,执行大括号{}内的语句

  • 第二种情况:如果条件为真,执行语句1;否则执行语句2

  • 第三种情况:如果条件1为真,执行语句1,否则如果条件2为真,执行语句2,否则,执行语句3

循环语句

在awk中,支持的for循环也有三种,分别是for, while,do ... while .具体如下:

# for循环语法格式1:
	for(初始化;布尔表达式;自增减){
		//执行代码
	}
# 实例
	for(i=0;i<=10;i++){print i}
# 说明	
	1.初始化变量的值
	2.开始执行布尔表达式,如果为真,执行后面的打印语句
	3.进行+1
	4.重复执行第2,3步骤
	
# for循环语法格式2:
	for(变量 in 数组){
		//执行代码
	}
#实例
	for(i in arrname){
		print i,arrname[i]
	}
	
# while循环语法格式
	while(布尔表达式){
		//执行代码
	}
#实例
	while(i<=10){print i}
# 说明	
	1.执行条件判断,若为真,执行后面打印语句
	2.重复循环第1步骤

# do ... while循环语法
	do{
		//执行代码
	}while(条件)
#实例
	do{print "helloworld";i++}while(i<=3)
# 说明
	1.先执行打印语句,然后再自加1
	2.执行条件判断,若为真,继续执行打印语句,然后再自加1,依次循环,直到条件变为假。

当然除了以上的循环外,我们还可以在跳过本次循环,或者断开循环 . 分别使用的关键词为:

  • 跳过循环:continue

  • 断开循环:break

 

7.实例

以下练习主要使用abc.log文本进行练习;

[root@localhost test]# cat abc.log 
drwxr-xr-x.  20 root root  3360 9月  29 05:19 dev
drwxr-xr-x.   3 root root    20 9月  14 03:08 docker_registry
drwxr-xr-x.   2 root root    41 9月  17 06:23 docker_study
drwxr-xr-x. 151 root root 12288 9月  29 05:20 etc
drwxr-xr-x.   3 root root    18 9月  10 06:57 home
lrwxrwxrwx.   1 root root     7 9月  10 06:12 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 9月  10 06:12 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 4月  11 2018 media
drwxr-xr-x.   2 root root    21 9月  19 21:51 mnt

1.输出第一,第二列数据,中间不空格

2.输出第1,3,5列数据,以制表符进行分割  

3.显示每行有多少字段  

4.将列数大于等于10的行打印出来  

5.显示第5,第7行的数据  

6.打印出包含etc的行  

7.打印出含有etc或者home的行  

8.打印输出第二列小于5的行  

9.打印第一列中不是以目录开头的行  

10.显示文件中第9个字段包含dev的行的第1和第9个字段  

11.显示文件中第9个字段不包含dev的行的第1和第9个字段  

12.如果第2列以两个数字结束就打印这个记录。  

13.如果第2列等于1或者第7列小于15,则打印该行。  

14.如果第2列大于5则打印?后面的表达式值,否则打印冒号后面的表达式值。  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/330442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手拉手Vue组件由浅入深

组件 (Component) 是 Vue.js 最强大的功能之一&#xff0c;它是html、css、js等的一个聚合体&#xff0c;封装性和隔离性非常强。 组件化开发&#xff1a; 1、将一个具备完整功能的项目的一部分分割多处使用 2、加快项目的进度 3、可以进行项目的复用 组件注册分…

IaC基础设施即代码:Terraform 连接 aws S3 实现多资源管理

目录 一、实验 1.环境 2.aws 亚马逊云创建用户 3.Windows使用Terraform 初始化 aws provider 4.Windows使用Terraform 创建S3存储资源 &#xff08;对象存储&#xff09; 5.Windows使用Terraform 创建Dynamo DB资源 &#xff08;表格存储&#xff09; 6.Windows给Terrafo…

Skywalking链路追踪

目录 一、简介1.1、APM系统1.2、SkyWalking 简介 二、快速入门2.1、下载、启动2.2、界面认识 三、持久化存储四、告警通知五、自定义追踪-细粒度追踪service方法 一、简介 1.1、APM系统 APM&#xff08;Application Performance Monitoring&#xff09;系统是一种用于监控和管…

《Redis:NoSQL演进之路与Redis深度实践解析》

文章目录 关于NoSQL为什么引入NoSQL1、单机MySQL单机年代的数据库瓶颈 2、Memcached&#xff08;缓存&#xff09; MySQL 垂直拆分 &#xff08;读写分离&#xff09;3、分库分表水平拆分MySQL集群4、如今的网络架构5、总结 NoSQL的定义NoSQL的分类 Redis入门Redis能干嘛&…

AI教我学编程之C#类的基本概念(1)

前言 在AI教我学编程之C#类型 中&#xff0c;我们学习了C#类型的的基础知识&#xff0c;而类正是类型的一种. 目录 区分类和类型 什么是类&#xff1f; 对话AI 追问 实操 追踪属性的使用 AI登场 逐步推进 提出疑问 药不能停 终于实现 探索事件的使用 异步/交互操作 耗时操…

IO网络4.0

思维导图 tftp上传 #include <myhead.h>#define ERR_LOG(msg) do{\perror(msg);\printf("%d %s %s\n", __LINE__, __func__, __FILE__);\ }while(0)#define PORT 69 #define N 516int do_upload(int sfd, struct sockaddr_in sin);int main(int a…

k8s的对外服务ingress

1、service的作用体现在两个方面 &#xff08;1&#xff09;集群内部&#xff1a;不断跟踪pod的变化&#xff0c;更新deployment中的pod对象&#xff0c;基于pod的ip地址不断变化的一种服务发现机制 &#xff08;2&#xff09;集群外部&#xff1a;类似于负载均衡器&#xff…

PuTTY的ppk密钥与OpenSSH密钥之间的相互转换

几个概念说明&#xff1a;id_rsa、id_rsa.pub、ppk、pem 目前有两个主流的密钥格式&#xff1a;OpenSSH格式的密钥 和 PuTTY格式的密钥。 id_rsa和id_rsa.pub 都是OpenSSH格式的密钥。 id_rsa是OpenSSH格式的SSH私钥。 id_rsa.pub是OpenSSH格式的SSH公钥。ppk文件 ppk文件是P…

机器视觉系统在汽车车轮毂检测上的应用

将机器视觉用于轮毂检测&#xff0c;可以利用图像分析的方法来测量轮毂特征尺寸、判断轮毂形状&#xff0c;并获取其位置坐标等信息&#xff0c;从而能够辨识流水生产线上的各种款式和型号的汽车轮毂。 市面上对汽车车轮毂具体检测要求如下 &#xff1a; 1.为了分辨流水线上…

HTTPS:如何确保您的网站数据传输安全?

目录 博客前言 一.HTTPS 1.1 HTTPS简介 1.2 HTTP和HTTPS区别 1.3 TLS/SSL协议工作原理 1.3.1 TLS/SSL协议结构 1.3.2 SSL/TLS握手协议建立连接过程 1.2.3 SSL/TLS报文分析 博客前言 以下是一个关于HTTPS协议的博客前言示例&#xff1a; 欢迎来到我的博客&#xff0c;今…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

【面试】测试/测开(ING3)

190. 栈和堆在内存管理上的区别 栈 1&#xff09; 栈是由系统自动分配和回收的内存。 2&#xff09;栈的存储地址是由高地址向低地址扩展的。 3&#xff09;栈是一个先进后出的结构。 4&#xff09;栈的空间大小是一个在编译时确定常数&#xff0c;即栈的大小是有限制的&#x…

2024年回炉计划之排序算法(一)

算法是计算机科学和信息技术中的重要领域&#xff0c;涉及到问题求解和数据处理的方法。要学习算法&#xff0c;你可能需要掌握以下一些基本知识&#xff1a; 基本数据结构&#xff1a; 了解和熟练使用各种数据结构&#xff0c;如数组、链表、栈、队列、树和图等。数据结构是算…

新能源汽车智慧充电桩方案:基于视频监控的可视化智能监管平台

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩方案围绕互联网、物联网、车联网、人工智能、视频技术、大数据、4G/5G等技术&#xff0c;结合云计算、移动支付等&#xff0c;实现充电停车一体化、充电桩与站点管理等功能&#xff0c;达到充电设备与站点的有效监控…

【汇编】实验12 编写0号中断的处理程序

记录一下代码 assume cs:code code segment start:mov ax,csmov ds,axmov si,offset do0mov ax,0mov es,axmov di,200hmov cx,offset do0end-offset do0cldrep movsb ;将ds:si的字节单元byte送入es:di&#xff0c;也就是将从do0处往下的指令复制到0:200h中。mov word ptr es:[…

阿赵UE学习笔记——11、地形系统

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法&#xff0c;这次来学习一下虚幻引擎的地形系统的用法。 一、创建地形 在选项模式里面&#xff0c;选择地形&#xff1a; 进入到地形界面之后&#xff0c;需要先创建一个地形&#xff1a; 留意看…

Springboot+vue的智能家居系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的智能家居系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的智能家居系统&#xff0c;采用M&#xff08;model&a…

【Android】为什么在子线程中更新UI不会抛出异常

转载请注明来源&#xff1a;https://blog.csdn.net/devnn/article/details/135638486 前言 众所周知&#xff0c;Android App在子线程中是不允许更新UI的&#xff0c;否则会抛出异常&#xff1a; android.view.ViewRootImpl$CalledFromWrongThreadException: Only the origin…

芯片新闻-Global Semiconductor Sales Increase 5.3% Year-to-Year in November

11 月标志着一年多以来市场同比增长的第一个月&#xff1b;全球芯片销量环比增长2.9% 华盛顿——一月。 2024 年 12 月 9 日——半导体行业协会 (SIA) 今天宣布&#xff0c;2023 年 11 月全球半导体行业销售额总计 480 亿美元&#xff0c;比 2022 年 11 月的 456 亿美元总额增…

rust获取本地外网ip地址的方法

大家好&#xff0c;我是get_local_info作者带剑书生&#xff0c;这里用一篇文章讲解get_local_info的使用。 get_local_info是什么&#xff1f; get_local_info是一个获取linux系统信息的rust三方库&#xff0c;并提供一些常用功能&#xff0c;目前版本0.2.4。详细介绍地址&a…