awk用法小结

awk是linux下一款很强大的文本处理工具,也能够方便的用在shell程序中完成对文本的处理。若是只是须要awk简单功能的话,语法很简单。前段时间学了一点,在此作下总结。linux

1、基本语法正则表达式

按本身的理解来说,awk是逐行对列进行操做的。换句话说,awk每次处理一行,对这一行的每一个“域”处理完以后再处理下一行的域。域的划分方式能够本身指定,默认是以空格和制表符来分割。awk语句要在一对单引号内,所要作的操做要在一对花括号内,语法与c语言很相似,融汇贯通便可,如:shell

awk 'BEGIN {FS=":"} {print $1}' /etc/passwd

这条语句的意思是以":"做为分隔符,输出/etc/passwd文件的第一列。为何最前面要加BEGIN这个关键字呢?由于awk在作任何操做以前会先读入一行文本,这样,第一行的分隔符就不是":"了。因此,加上BEGIN的目的就是让awk在读入第一行以前先把分隔符设定好。除了BEGIN关键字以外,还有END这个关键字,如:数组

awk 'BEGIN {FS=":";print "******"} {print $1} END {print "******"}' /etc/passwd

会以":"为分隔符,而且在最头和最尾输出"******"。bash

此外,花括号加在不一样的位置,对程序含义有很大影响,如如下两段程序:ide

awk 'BEGIN {FS=":"} {if ($1=="root") $1="rot";print $1}' /etc/passwd
awk 'BEGIN {FS=":"} {if ($1=="root") {$1="rot";print $1}}' /etc/passwd

第一段程序会输出/etc/passwd文件第一列的所有内容,并把"root"变为"rot"输出,第二段程序只是把"root"变为"rot"输出,其余并未输出。
函数

2、正则表达式工具

在awk中使用正则表达式要用//括起来,如匹配"passwd"这个字符串,语法是/passwd/。举个例子,在/etc/passwd文件的第一列匹配"root"关键字,若是匹配到则输出整行,若是匹配不到则不输出。字符串

awk 'BEGIN {FS=":"} {if ($1~/root/) print $0}' /etc/passwd

3、内置变量和字符串函数it

awk中最经常使用的三个内置变量是FS、NF、NR,三者的含义分别为分隔符、当前处理的域(数字)、当前行(数字)。

awk内置的字符串函数主要有gsub(r,s),gsub(r,s,t),index(s,t),length(s),match(s,r),split(s,a,fs),sub(r,s),substr(s,p),substr(s,p,n)

一、gsub(r,s)

在$0上用s替换r

二、gsub(r,s,t)

在t上用s替换r

三、index(s,t)

定位出t在s中的位置

四、length(s)

顾名思义

五、match(s,r)

与index相似,不过此时r能够用正则表达式

六、split(s,a,fs)

将s以分隔符fs分隔开,放入数组a中,如:

awk 'BEGIN {print split("1*2*3",a,"*")}'

为何要加"BEGIN"呢,按个人理解,awk在开始执行命令语句以前,会读取后面文件的一行内容做为输入,但若是后面不接任何文件,awk就会一直卡在那儿,因此,加上BEGIN的目的就是为让awk在读取文件内容以前就执行命令,不会让它卡住。

七、sub(r,s)

以s替换r,与gsub不一样的是,sub只执行一次替换。

八、substr(s,p)

输出字符串s中第p个字符及以后的字符,如:

awk 'BEGIN {FS=":"} {print substr($1,1,3)}' /etc/passwd

输出/etc/passwd中第一个字段中三个字符的数据。

相关文章
相关标签/搜索