一、变量概述

  对于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. 记录 Docker 的学习过程 (自建私有仓库)

    私有仓库的创建 node1#wget http://harbor.orientsoft.cn/harbor-v1.4.0/harbor-offline-installer-v1.4.0.tgz nod ...

  2. 【终端使用】常用Linux命令的基本使用

    常用Linux命令的基本使用: 命令 对应英文 作用 ls list 查看当前文件夹下的内容 pwd print work directory 查看当前所在的文件夹 cd [目录名] change d ...

  3. MySQL必会的50个常见面试练习题

    下面的SQL题目都是比较基础,比较常见的数据库SQL面试题,在技术面试环节虽然碰到相同题目的机会比较少,但解题的基本思路都是差 不多的.下面是SQL面试题描述: Student(Sid,Sname,S ...

  4. 关于向sql中插入datetime部分问题总结

    非int型数据要加单引号, 用format格式化当前时间后用String插入即可 读取时用时间戳读取datetime或转化为string存储 读 public static String gainTi ...

  5. Quartz.NET 2.x教程

    第1课:使用Quartz第2课:工作和触发器第3课:关于工作和JobDetails的更多信息第4课:有关触发器的更多信息第5课:SimpleTriggers第6课:CronTriggers第7课:Tr ...

  6. C语言 goto

    C语言 goto 功能:无条件跳转.不推荐使用 案例 #include <stdio.h> int main() { // 函数跳转.循环跳转 // 创建标志位开始 // 无条件跳转到En ...

  7. (转)预估大数据量下UV的方法

    在实际应用中,我们经常碰到这种情况,即要统计某个对象或者事件独立出现的次数.对于较小的数据量,这很容易解决,我们可以首先在内存中对序列进行排序,然后扫描有序序列统计独立元素数目.其中排序时间复杂度为O ...

  8. Sublime Text(代码编辑软件)

    特点 Sublime Text 3是一个轻量.简洁.高效.跨平台的编辑器,方便的配色以及兼容vim快捷键等各种优点: 它体积小巧,无需安装,绿色便携:它可跨平台支持Windows/Mac/Linux: ...

  9. JDBC添加为null的数据报错

    定义实体类的时候定义为了基本数据类型,不能接收null需要改为引用数据类型

  10. python:创建文件夹

    #!/usr/bin/python# -*- coding:utf-8 -*- import os dir = './dir'os.mkdir(dir)