点击返回 自学Linux命令行与Shell脚本之路

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程序高级特性的更多相关文章

  1. 自学Linux Shell19.1-gawk程序基础特性

    点击返回 自学Linux命令行与Shell脚本之路 19.1-gawk程序基础特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. gawk概念 awk是一个强大的文本分析工具 ...

  2. 自学Linux Shell4.1-监测程序ps top kill

    点击返回 自学Linux命令行与Shell脚本之路 4.1-监测程序ps top kill 1. PS命令 linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的 ...

  3. 自学Linux命令行与Shell脚本之路

    自学Linux命令行与Shell脚本之路[第一回]:初识Linux   1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3  ...

  4. 自学Linux Shell18.2-sed编辑器高级特性

    点击返回 自学Linux命令行与Shell脚本之路 18.2-sed编辑器高级特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. sed小结 命令格式: 1 sed [opt ...

  5. 自学Linux Shell18.1-sed编辑器基础特性

    点击返回 自学Linux命令行与Shell脚本之路 18.1-sed编辑器基础特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. sed概念 sed是stream edito ...

  6. 自学Linux Shell9.1-安装软件程序

    点击返回 自学Linux命令行与Shell脚本之路 9.1-linux安装软件程序 PMS利用一个数据库来记录各种相关内容: Linux系统安装了什么软件包 每个包安装什么文件 每个已安装软件包的版本 ...

  7. 「小程序JAVA实战」小程序视图之细说wx:key列表高级特性(16)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-16/ wx:key的高级特性.这个很重要,因为在app上经常有上拉,下拉加载,我们如果不使用这个特 ...

  8. 自学Linux Shell8.1-linux文件系统概述及操作

    点击返回 自学Linux命令行与Shell脚本之路 8.1-linux文件系统概述及操作 1. linux支持的文件系统 Windows常用的分区格式有三种,分别是FAT16.FAT32.NTFS格式 ...

  9. Linux运维入门到高级全套常用要点

    Linux运维入门到高级全套常用要点 目 录 1. Linux 入门篇................................................................. ...

随机推荐

  1. Luogu3199 HNOI2009 最小圈 分数规划、SPFA

    传送门 可以发现它的式子是一个分数规划的式子,所以可以二分答案,将所有边权减掉当前二分值之后跑一边$SPFA$判断负环即可. 然而这道题把$BFS-SPFA$卡掉了却没卡$DFS-SPFA$ 出题人: ...

  2. 微软下一代Web前端技术Blazor(C#编译为WebAssembly)

    W3C Web标准化机构在制定下一代的网页技术WebAssembly.目前版本是1.0,主流浏览器的最新版本都已经支持.其特点是浏览器可以执行编译后的二进制程序,不需要像之前的程序,浏览器下载Java ...

  3. 【LGR-047】洛谷5月月赛

    这次我期待了很久的Luogu月赛崩掉了 传说中的Luogu神机就这样被卡爆了 然后我过了20min才登上Luogu的网站,30min后才看到题目 然后交T1TM的不给我测!!!然后又交了一次机子就炸了 ...

  4. [Oracle]如何观察Table 的各种Lock 之间的冲突

    [Oracle]如何观察Table 的各种Lock 之间的冲突 举例: Session#15 创建表: SID 15==============create table t1 (c1 number)p ...

  5. Scala学习(五)---Scala中的类

    Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...

  6. redis调优的实战经验

    本文根据redis的info命令查看redis的内存使用情况以及state状态,来观察redis的运行情况以及需要作出的相应优化. info 1.memory used_memory:13409011 ...

  7. 解决Jira和Confluence访问打开越来越缓慢问题

    Jira和Confluence部署在同一台服务器上,跑一段时间后,发现访问jira和confluence时,打开越来越缓慢.这是因为根据主机物理内存不同,默认的java虚拟机内存也会不同(一个较低值) ...

  8. ecna2017-Game of Throwns

    这题就是给你一个标号为0-n-1的环,然后给你M个操作,操作有两种,一种是直接给一个数,这数的正负代表我当前向前(向后)仍了xx个位置的球,或者给你一个撤销操作表示为 undo m,表示撤销最近的M个 ...

  9. 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花

    求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...

  10. Uniform Generator HDU1014

    题意 给你公式seed(x+1) = [seed(x) + STEP] % MOD ,输入step和mod, 问你是否可以从第一项0,算到mod,它们是否都不同 是 good choice 否则 ba ...