自学Linux Shell19.2-gawk程序高级特性
19.2-gawk程序高级特性
linux世界中最广泛使用的两个命令行编辑器:
- sed
- gawk
1. gawk使用变量
编程语言共有的特性是使用变量来存取值。gawk编程语言支持两种不同类型的变量:
- 内建变量
- 自定义变量
1.1 内建变量
gawk程序使用内建变量来引用程序数据里的一些特殊功能。
1.1.1 字段和记录分隔符变量
变量 | 描述 |
FIELDWIDTHS | 由空格分隔开的定义了每个数据字段确切宽度的一列数字 |
FS | 输入字段分隔符 |
RS | 输入数据行分隔符/记录分隔符 |
OFS | 输出字段分隔符 |
ORS | 输出数据行分隔符/记录分隔符 |
- 变量FS OFS定义了gawk如何处理数据流中的数据字段
- 变量RS ORS定义了gawk如何处理数据流中的记录分隔行
变量OFS时用在print命令的输出上面, 默认情况下gawk将OFS设置成空格。通过设置OFS的值,可以再输出中使用任意字符串来分割字段。
FIELDWIDTHS变量允许不使用字段分隔符来读取记录,一旦设置了FIELDWIDTHS变量,gawk就会忽略FS变量,并根据提供的字段宽度来计算字段。
默认情况下,gawk将RS、ORS设为换行符 。 默认RS表明输入数据流中的每行新文本就是一条新纪录。
典型例子就是,FS变量设置成换行符,表明数据流中的每行都是一个单独的字段,每行的所有数据都属于同一个字段。
RS变量设置成空字符串,然后在数据记录中留一个空白行,即是把每个空白行当做一个记录分隔符。
1.1.2 数据变量
变量 |
描述 |
ARGC |
出现的命令行参数的个数 |
ARGIND |
当前正在处理的文件在ARGV中的索引 |
ARGV |
命令行参数数组 |
CONVFMT |
数字的转换格式(参见printf语句)。默认值为%.6g |
ENVIRON |
当前shell环境变量及其值的关联数组 |
ERRNO |
当读取或关闭输入文件时发生错误时的系统错误 |
FILENAME |
用于输入到gawk程序的数据文件的文件名 |
FNR |
数据文件的当前记录号 |
IGNORECASE |
如果设置为非0,则忽略gawk命令中使用的字符串的大小写 |
NF |
数据文件中数据字段的个数 |
NR |
已处理的输入记录的个数 |
OFMT |
显示数字的输出格式。默认为%,6g |
RLENGTH |
匹配函数中匹配上的子字符串的长度 |
RSTART |
匹配函数中匹配上的子字符串的开始索引 |
以上表明,AGRC变量表明命令行上面有两个参数,gawk和adta.txt 。ARGV数组从索引0开始,ARGV[1]就是data.txt
1.2 自定义变量
- gawk自定义变量名可以使任意数目的字母、数字和下划线,但不能以数字开头
- gawk变量名区分大小写
1.2.1 在脚本中给变量赋值
gawk程序给变量赋值跟在shell脚本中赋值类似,都用赋值语句。
gawk变量可以保存数值或文本值,也可包含数学算式来处理数字值。
1.2.2 在命令行上给变量赋值
gawk程序可以在命令行上给变量赋值。
存在一个问题: 若设置了变量后,这个值在打码的BEGIN部分不可用。
解决办法:
可以使用-v命令行参数,它允许你在BEGIN代码之前设定变量,在命令行上,-v命令行参数必须放在脚本代码之前。
2. gawk处理数组
关联数组和数字数组不同之处就是它的索引值可以使任意文本字符串。
关联数组用各种字符串来引用值,每个索引字符串都必须能够唯一地表示出赋给它的数据元素。
2.1 定义数组变量
var[index]= element
index 是关联数组的索引值,element是数据元素值。
2.2 遍历数组变量
for (var in array)
{
statements
}
- for循环会在每次循环时将数组array的下一个索引值赋值给变量var,然后执行一遍statements
- 变量储存的是索引值而不是数组元素值。
- 索引值不会按任何特定的顺序返回,但他们都能指定对应的数据元素值。
2.3 删除数组变量
delete array[index]
删除命令会从数组中删除关联索引值和相关的数据元素值。
3. gawk使用模式
3.1 正则表达式
gawk使用正则表达式时,正则表达式必须出现在它要控制的程序脚本的左侧花括号前面。
以上正则表达式/11/匹配了数据字段中含有字符串11的记录。
3.2 匹配操作符~ !
- 匹配操作符允许将正则表达式限定在记录中的特定数据字段。可以指定匹配操作符、数据字段变量及要匹配的正则表达式。
- 可以使用!符号来排除正则表达式的匹配。
3.3 数学表达式
- 可以使用普通数学表达式,x == y; x<=y;x>y 等等
- 也可以对文本数据使用数学表达式,但是一定要完全匹配(若无匹配,没有任何记录)
以上显示脚本查看第4个数据字段含有值为0的记录,即显示属于root用户组的系统用户。
4. gawk使用结构化命令
4.1 gawk使用if语句
if (condition)
statement1
if (condition) statement1
if (condition)
statement1;
else
statement2
if (condition) statement1; else statement2
- 如果需要在if语句执行多条语句,必须用花括号将它们括起来
- 不能混用if语句的花括号和用来表示程序脚本开始和结束的花括号
- gawk的if语句支持else子句,允许在if语句条件不成立的情况下执行一条或多条语句
4.2 gawk使用while语句
while (condition)
{
statements
}
- while循环允许遍历一组数据,并检查迭代的结束条件。
- gawk允许在while循环内使用break和continue语句从循环内跳出。
4.3 gawk使用do - while语句
do
{
statements
} while (condition)
保证了语句在条件被求值之前至少执行一次。
4.4 gawk使用 for 语句(支持C风格的for循环)
for (variable assignment;condition;iteration process)
5. gawk使用格式化打印printf
printf format, item1, item2, ...
- format是必须的;
- 不会自动换行,需显式给定行分隔符;
- format中需要分别为后面的每个item指定一个格式符;
格式化指定符采用如下格式:
都以%开头,后跟一个字符
- %c: 显示字符的ASCII码;
- %d,%i: 显示十进制整数;
- %e, %E: 科学计数法显示数值;
- %f: 显示为浮点数;
- %g, %G: 以科学计数法格式或浮点数格式显示数值;
- %s: 字符串
- %u: 无符号的整数
- %%: 显示%自身
除了以上控制字母,还有3中修饰符:
- width 指定了输出字符最小宽度的数字值
- prec 一个数值,指定了浮点数中小数点后面的位数或者文本字符串中显示的最大字符数
- -(减号) 指明在向格式化空间中放入数据时采用左对齐还是右对齐(默认是右对齐)
6. gawk常用的内建函数
6.1 gawk数学函数
- exp(x) x的指数函数
- int(x) x的整数部分
- rand() 0至1之间的随机浮点数
6.2 gawk字符串函数
- asort(s [,d]) 将数组s按数据元素值排序
- index(s,t) 返回字符串t在字符串s中的索引值
- length([s]) 返回字符串s的长度
6.3 gawk时间函数
- mktime(datespec) 将一个按YYYY MM DD HH MM SS格式的日期转换成时间戳
- systime() 返回当前时间的时间戳
- strftime(format [,timestamp]) 将时间戳转成date()格式化日期
7. gawk自定义函数
7.1 gawk自定义函数
function name([variables])
{
statements
}
- name是用户定义函数的名称。
- 函数名称应以字符的字母并且其余部分可以是数字,字母或下划线的任意组合。
- gawk的保留字不能被用作函数名称。
- 函数可以接受以逗号分隔的多个参数。参数不是强制性的。我们也可以创建一个用户定义的函数不带任何参数。
7.2 gawk使用自定义函数
在定义函数时,必须出现在代码块之前(包括BEGIN代码块)。
7.3 gawk使用库函数
gawk可以使用将多个函数放置在一个库文件中,通过调用库文件使用所有的函数。
....
自学Linux Shell19.2-gawk程序高级特性的更多相关文章
- 自学Linux Shell19.1-gawk程序基础特性
点击返回 自学Linux命令行与Shell脚本之路 19.1-gawk程序基础特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. gawk概念 awk是一个强大的文本分析工具 ...
- 自学Linux Shell4.1-监测程序ps top kill
点击返回 自学Linux命令行与Shell脚本之路 4.1-监测程序ps top kill 1. PS命令 linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的 ...
- 自学Linux命令行与Shell脚本之路
自学Linux命令行与Shell脚本之路[第一回]:初识Linux 1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3 ...
- 自学Linux Shell18.2-sed编辑器高级特性
点击返回 自学Linux命令行与Shell脚本之路 18.2-sed编辑器高级特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. sed小结 命令格式: 1 sed [opt ...
- 自学Linux Shell18.1-sed编辑器基础特性
点击返回 自学Linux命令行与Shell脚本之路 18.1-sed编辑器基础特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. sed概念 sed是stream edito ...
- 自学Linux Shell9.1-安装软件程序
点击返回 自学Linux命令行与Shell脚本之路 9.1-linux安装软件程序 PMS利用一个数据库来记录各种相关内容: Linux系统安装了什么软件包 每个包安装什么文件 每个已安装软件包的版本 ...
- 「小程序JAVA实战」小程序视图之细说wx:key列表高级特性(16)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-16/ wx:key的高级特性.这个很重要,因为在app上经常有上拉,下拉加载,我们如果不使用这个特 ...
- 自学Linux Shell8.1-linux文件系统概述及操作
点击返回 自学Linux命令行与Shell脚本之路 8.1-linux文件系统概述及操作 1. linux支持的文件系统 Windows常用的分区格式有三种,分别是FAT16.FAT32.NTFS格式 ...
- Linux运维入门到高级全套常用要点
Linux运维入门到高级全套常用要点 目 录 1. Linux 入门篇................................................................. ...
随机推荐
- CF487E Tourists 圆方树、树链剖分
传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...
- C# 实现表单的自动化测试<通过程序控制一个网页>
学历代表你的过去,能力代表你的现在,学习代表你的将来 十年河东,十年河西,莫欺少年穷 学无止境,精益求精 C# 实现表单的自动化测试,这标题看着就来劲!那么,如何通过C#程序控制一个网页呢? 在此,以 ...
- 微信小程序日常开发中常遇到的错误代码
在开发过程中,会遇到很多微信返回的状态码,鬼知道代表什么意思,现在好了,整理总结了一份状态码,方便大家. 微信小程序错误码参考 状态码(场景值) 说明 -1 系统繁忙 0 请求成功 40001 ...
- (一)ABP添加控制器和页面(有时候页面不出来)
1:添加控制器后需要写[Area("AppAreaName")] 2:继承 WebControllerBase 3:创建视图就可以出现index页面了
- zabbix监控交换机、防火墙等网络设备
zabbix3.4.4监控交换机/防火墙是非简单,只需知道交换机/防火墙的snmp密码,然后连接下自带或导入的snmp模板,就可以完成监控了.比如添加地址为172.10.11.5的交换机监控. 1)登 ...
- linux-镜像下载
https://blog.csdn.net/sinat_36564972/article/details/81560395 Centos6.5镜像下载 2018年08月10日 11:35:53 深夜搬 ...
- Eddy's mistakes HDU
链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1161] 题意 把字符串中大写字母变为小写 . 分析 主要是含有空格的字符串如何读入,用getline(c ...
- PairWork-电梯调度程序结对编程【附加题】
1 接口改进 1) 之前判断电梯是否闲置的函数不太好理解,重新修改了,如下所示: //是否停顿状态(停止的以及开门间隔>=0) public bool IsIdle { get { return ...
- PairProject-电梯调度程序结对编程
结对编程人员:184/050 1 结对编程 1.1 结对编程的优缺点 优点: ● 与单独开发相比,结对能够使人们在压力之下保持更好的状态.结对编程鼓励双方保持代码的高质量,即使在出现了让人不得不飞快地 ...
- Linux内核分析 读书笔记 (第十八章)
第十八章 调试 18.1 准备开始 1. 需要的只是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在跟踪bug的时候,掌握的信息越多越好. 18.2 内核中的bug 1. ...