首页 > 代码库 > awk基础用法
awk基础用法
awk是神通广大的工具,不学一下的话,shell脚本写起来真的好艰难。。。
awk有很多不同的版本,这里采用的是gawk(依我看,功能都差不多),它用来检索一些文件,从中找出匹配指定模式的行,然后在这些行上执行指定的动作。
基本格式如下:
gwak options ‘pattern {action}‘ file-list
其中,file-list是gawk的数据来源;options是一些特定的选项;主要部分“模式+动作”必须要放在单引号内,而且动作还要用花括号括起来。主要部分如果太多的话,还可以写进一个文件中(暂且取名program)集合起来,然后用
-f program代替单引号及其内容,当然这是gawk更高级的用法,而且program本身有自己的一些语法规则,以后有时间我会再写一篇文章介绍,这篇就不涉及这一块了,只简单介绍一些基本的用法。
1、基本
一般pattern和action是配对的,然后单引号内可以有很多个这样的对,即在不同的模式上执行不同的动作,写在program的内容实际上主要也是这些。如果缺省pattern则默认选中一个文件所有的行;而缺省action则默认打印匹配的行到屏幕。两个部分可以同时缺省,但是单引号还是必须要打上去,不然就会报错,而且同时缺省gawk什么也不会做。。
对file-list的处理是一个一个进行的,即先在一个file上执行完所有的pattern-action对,再进行下一个文件的处理;而不是用同一个pattern-action对一次性处理完所有文件,再用下一个pattern-action对处理所有文件。
2、pattern
基本形式就是用两个斜杠包围起来的字符串,如/abc/,然后gawk就会检索包含这个字符串的行。模式必须要用斜杠包围起来,裸字符串不起作用的。字符串还可以表现为一个正则表达式,使用各种元字符(如^,表示行首)和逻辑运算符(如 | ,表示或)。pattern还可以用逻辑运算符号(如||,与斜杠内部使用的“或”形式不同)将两个pattern连接起来作为一个使用。如:
gawk ‘/^ab/‘ file 打印开头是ab的行
模式还可以取反,像grep的-v选项那样,方法就是在第一个斜杠前加“!”,如下
gawk ‘!/^ab/‘ file 打印开头不是ab的行
pattern更常见的形式恐怕就是字段和变量了,前面的模式类型只是粗糙的用整行来做匹配,只要这一行里有模式的身影,那这一行就会被选中,然后action也是以行为单位进行的。但是使用字段和变量就可以深入到行内部精细化操作,这其实也是gawk比grep和sed更擅长的地方,它更擅长处理那些结构化的数据,即file里面的数据是按照某种格式“整齐”的排列,就像excel里面的那样,有了“单元格”的雏形。比如在终端输入netstat -apn,会出现如下画面:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN -
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:538 0.0.0.0:* LISTEN -
每一行数据被“格式化”了,形成了统一的结构,行内数据被分成了不同的字段,字段之间存在明显的分隔符,或者是tab或者是空格或者是其他形式。
在pattern中,是可以引用字段级别的数据的,方式就是$1 $2 $3 $4.....,$n代表一行从从到右第n个字段。于是我们可以匹配到字段级别,而不再用整行来做匹配。匹配的方法就是 $n~/str/,比如:
gawk ‘$2 ~ /man/‘ file 打印第二个字段含有“man”的行
gawk ‘$2 !~ /man/‘ file 打印第二个字段不含有“man”的行(模式取反)
另外还有两个独特的模式,分别是BEGIN和END,这两个模式并不匹配file的任何行,只是占个坑。BEGIN表示在检索file之前要执行与其相关的action,END表示在处理完file的所有行之后要执行与之相关的action。
3、action
action必须要用花括号括起来,这在前面已经强调过。action可以是一条命令,也可以是多条命令,但是命令之间要用分号间隔。
action的内容是丰富多样的,本质上它就是一个小shell脚本,不仅可以是执行各种各样的命令组合,也可以有if等控制结构,还可以定义变量。不过正如前面所说,如果缺省action的话,实际上执行的是print命令,即打印相关内容到标准输出。也可以显式的指定,如:gawk ‘{print}‘ file。
4、选项options
主要就是-f和-F,前者在前面已经说过了,后者的作用是指定每一行的分隔符。默认情况下,每一行的分隔符是tab,但是有些文件里面用的是各种其他的分隔符,比如冒号等,这时候必须要重新指定分隔符,不然gawk不能识别不同的字段。如下:
gawk -F : ‘{print}‘ file 这就会把冒号视分隔符读取file的数据
如果有多个分隔符,则需要用方括号把分隔符括起来,如:
gawk -F [:-] ‘{print}‘ file 把:和-均视为分隔符,注意这不是说它们俩一起作为分隔符,而是每个都是单独的分隔符。
5、内置变量
gawk中可以在花括号内定义变量,除此之外gawk还有内部定义的一些变量,可以直接拿来使用,比如刚才的$1 $2等。下面介绍其他的:
$0 这个变量代表当前一整行内容(也称为一个记录),如 gawk ‘/man/ {print $0}‘ file 会把匹配的一整行内容打印出来(好吧,这也是打印的默认选项);但是gawk ‘/man/ {print $1}‘ file 却只打印匹配行的第一个字段。
NF 代表每一行有多少个字段
NR代表当前正在处理的行的编号,每处理完一行,NR自动加1
FILENAME 代表当前处理的文件名(null代表标准输入)
FS 代表读取文件时的字段分隔符(默认为空格或换行)
OFS 代表输出时采用的字段分隔符(默认为空格)
ORS 代表输出时采用记录(行)分隔符(默认为换行)
RS 读取文件时采用的分隔符(默认为换行)
awk基础用法