一、变量概述

  对于awk来说"变量"又分为"内置变量" 和 "自定义变量" , "输入分隔符FS"和"输出分隔符OFS"都属于内置变量。内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量。

awk常用的内置变量以及其作用如下:

FS:输入字段分隔符, 默认为空格

OFS:输出字段分隔符, 默认为空格

RS:输入记录分隔符(输入换行符), 指定输入时的换行符,默认为换行符\n

ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符,默认为换行符\n

NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量

NR:行号,当前处理的文本行的行号。

FNR:各文件分别计数的行号

FILENAME:当前文件名

ARGC:命令行参数的个数

ARGV:数组,保存的是命令行所给定的各参数

二、内置变量

  2.1内置变量NR

  内置变量NR表示每一行的行号,内置变量NF表示每一行中一共有几列,那么,也就是说,我们可以通过下例中的方法,得到t1.txt文本中,每一行的行号以及每一行对应的列的数量。

【注意】细心如你一定注意到了一个细节,就是在打印 $0 , $1 , $2 这些内置变量的时候,都有使用到"$"符号,但是在调用 NR , NF 这些内置变量的时候,就没有使用"$",如果你有点不习惯,那么可能是因为你已经习惯了使用bash的语法去使用变量,在bash中,我们在引用变量时,都会使用$符进行引用,但是在awk中,只有在引用$0、$1等内置变量的值的时候才会用到"$",引用其他变量时,不管是内置变量,还是自定义变量,都不使用"$",而是直接使用变量名。

  2.2内置变量FNR

  当我们使用awk同时处理多个文件,并且使用NR显示行号的时候,效果如下图。

如果使用NR参数,会将两个文本文件看成一个文件来显示(计数)行号;如果使用FNR参数,就会将两个文本文件分别显示(计数)行号。效果如下:

  2.3内置变量RS

  RS是输入行分隔符,如果不指定,默认的"行分隔符"就是我们所理解的"回车换行"。

假设,我们不想以默认的"回车换行"作为"行分隔符",而是想使用空格作为所谓的行分隔符,也就是说,我们想让awk认为,每遇到一个空格,就换行,换句话说,我们想让awk以为每次遇到一个空格就是新的一行(其它案例:让awk以为每次遇到一个#就是新的一行)。那么我们该怎么做呢?示例如下:

awk思维:只要遇到空格就是新的一行,否则属于同一行。

所以图中第5行才会出现这种情况。awk认为Jack就是第5行。

  2.4内置变量ORS

  现在,我们改变一下awk的想法,我们让awk认为,"**"才是真正的输出行分隔符,示例如下图:

在没有指定输出行分隔符之前,awk跟人类的逻辑思维是一样一样的,当人类想要换行的时候,就会"另起一行"(回车换行),awk也是一样的,当它在输出文字的时候,如果想要换行,就会"另起一行"(回车换行), 可是,如果我们指定了"输出行分隔符"为"**",那么,当awk在输出文字的时候,如果想要换行,就会"另起一行"(**),所以,对于awk来说,它完成了"另起一行"的动作,只不过,它所认为的"另起一行"的动作就是输出"**",而不再是原来的输出" 回车换行",所以,从人类看到的"表象上",awk并没有换行,那是因为我们还是以"回车换行"作为换行的标准,而awk已经变了,它认为,"**"就是换行的标准。

把"输入换行符"和"输出换行符"同时使用,看看是什么效果,示例如下:

  2.5内置变量FILENAME

  FILENAME这个内置变量,从字面上,就能看出是什么意思,没错,就是显示文件名,演示效果如下:

  2.6内置变量ARGV和ARGC

  ARGV内置变量表示的是一个数组,这个数组中保存的是命令行所给定的参数。这样解释还是很模糊,不容易理解,我们来看看示例:

先使用BEGIN模式,输出一个字符串"aaa",然后,传入两个文件的文件名作为参数,我们发现,BEGIN模式正常执行了打印操作,输出了"aaa"字符串 ,我们使用同样的命令,同样使用BEGIN模式,只不过,这次不只打印"aaa",还打印ARGV这个数组中的第二个元素的值。

ARGV内置变量表示的是一个数组,既然是数组,就需要用上图中的下标的方式,引用对应元素的值,因为数组的索引都是从0开始的,所以,ARGV[1]表示引用ARGV数组中的第二个元素的值,从返回结果可以看出,ARGV[1]对应的值为t1.txt,同理,我们又使用第三条命令,多打印了一个ARGV[2]的值,发现ARGV[2]对应的值为t2.txt,这个时候,你明白ARGV内置变量的含义了吗,说白了,ARGV内置变量表示的是:所有参数组成的数组。那么细心的你一定会问了,ARGV[0]对应的是哪个参数呢,我们来打印一下:

awk就是这么规定的,'pattern{ action }'并不被看做是参数,awk被看做为参数。

在刚才的例子中,应该有三个参数,awk、t1.txt、t2.txt,这三个参数作为数组的元素存放于ARGV中,现在,而ARGC则表示参数的数量,也可以理解为ARGV数组的长度。示例如下:

三、自定义变量

  方法一:-v varname=value  变量名区分字符大小写。

  方法二:在program中直接定义。

  3.1通过方法一自定义变量

  3.2通过方式二自定义变量

  直接在program中定义即可,但是注意,变量定义与动作之间需要用分号";"隔开。

  当我们需要在awk中引用shell中的变量的时候,则可以通过方法一间接的引用。举例如下:

【参考文章:http://www.zsythink.net/archives/1374】

awk从放弃到入门(3):awk变量的更多相关文章

  1. awk从放弃到入门(1):awk基础

    一.awk简介 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK ...

  2. awk从放弃到入门(2):awk分隔符

    一.awk分隔符 awk的默认分割符是空格,但是,这样描述并不精确,因为,awk的分隔符还分为两种,"输入分隔符" 和 "输出分隔符" . (1)输入分隔符:英 ...

  3. awk讲义-1-快速入门

    awk讲义-1-快速入门 一.目标问题: 1.统计各个省份中城市的数量(一维数组) 2.统计城市中区县数量,要求输出格式:省份 城市 区县数量(二维数组) 3.求两个文件的交集 4.省市和市区两个文件 ...

  4. awk 用法(使用入门)

    转自:http://www.cnblogs.com/emanlee/p/3327576.html awk 用法:awk ' pattern {action} '  变量名    含义 ARGC   命 ...

  5. awk(流程控制、内置变量、内置函数、数组)

    摘自:http://bbs.51cto.com/thread-883948-1-1.html awk(流程控制.内置变量.内置函数.数组) ... 参考其他的资料,给大家看看.一.awk流程控制语句 ...

  6. 那些年我用awk时踩过的坑——awk使用注意事项

    由于项目经历原因,经常使用awk处理一些文本数据.甚至,我特意下载了一个windows上的awk:gawk.exe,这样在windows上也能享受awk处理数据的方便性,. 俗话说,"常在河 ...

  7. 数据结构和算法(Golang实现)(2)简单入门Golang-包、变量和函数

    包.变量和函数 一.举个例子 现在我们来建立一个完整的程序main.go: // Golang程序入口的包名必须为 main package main // import "golang&q ...

  8. Awk 从入门到放弃 (6) Awk模式(Pattern)之二

    第一题:从/etc/passwd 匹配以 vmuser开头的用户 grep “^vmuser”   /etc/passwd  -r  -n awk  ‘/^vmuser /{print $0}’  / ...

  9. Awk 从入门到放弃(5)– Awk模式(Pattern)之一

    转:http://www.zsythink.net/archives/1426

随机推荐

  1. LeetCode 965. 单值二叉树 (遍历二叉树)

    题目链接:https://leetcode-cn.com/problems/univalued-binary-tree/ 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树. 只有给定的树是 ...

  2. 搜索 rerank : learn to rank 算法

    (1)LambdaMART 算法可参考如下两篇博客: http://www.cnblogs.com/wowarsenal/p/3900359.html http://www.cnblogs.com/w ...

  3. java学习笔记之IO编程—打印流和BufferedReader

    1.打印流(PrintWriter) 想要通过程序实现内容输出,其核心一定是要依靠OutputStream类,但是OutputStream类有一个最大缺点,就是这个类中的输出操作功能有限,所有的数据一 ...

  4. flex布局 居中

    display:flex;justify-content: center;检查侧轴是否居中,比如古代竖着写字,检查字是否在每条竹简的中央. display:flex;align-items: cent ...

  5. 《深入理解java虚拟机》读书笔记四——第五章

    第五章 调优案例分析与实战

  6. PP: Neural ordinary differential equations

    Instead of specifying a discrete sequence of hidden layers, we parameterize the derivative of the hi ...

  7. C++类this指针为空时的几个误区

    代码: class test{ public: static void f1(){cout<<y<<endl;} void f2(){cout<<y<< ...

  8. SpringBoot学习- 6、MetaData描述无法tip显示问题

    SpringBoot学习足迹 (一)先说说现象 1.在application.properties可以定义属性并在MetaData中增加description 如 生成additional-sprin ...

  9. 使用PHP链接MySQL

    一.使用PHP查询MySQL数据库: 1.通过PHP来访问MySQL的步骤是: 连接到MySQL 选择操作的数据库 创建查询的字段 执行查询的语句 检索出结果并在网页上显示 断开与MySQL的连接 我 ...

  10. 十分钟理解JavaScript引擎的执行机制

    关注专栏写文章 十分钟理解JavaScript引擎的执行机制 方伟景 千锋前端开发推动市场提升的学习研究者. 4 人赞同了该文章 首先,请牢记2点: JS是单线程语言 JS的Event Loop是JS ...