文本三剑客grep、sed、awk,grep主要应用于文本内容查找,sed可以对文本进行原处更改也可查找文本,awk是报告生成器。grep之前已经写过博客,这里不写了。
awk
awk不仅仅是一个命令而是一种编程语言,它具有一个编程语言基本上的编写格式,这个格式与bash的格式不相同,并且在不能在awk命令中不能直接使用``调用bash的命令,这个很让人凌乱。awk也是一行行的处理文本,只是可以把文本分为多个字段,进行细致的处理。
awk既然作为一门语言,那么我们就可以把awk分成一个个模块来说:awk命令格式,匹配,输出,变量,数组,变量操作,控制语句,调用系统命令,函数。
1 awk命令格式
awk[option] ‘progrem’file [file]
option的选项经常使用的不是很多
-F指定输入分隔符,$1代表第一个字段,$2代表第二个字段以此类推,$0代表打印整行 -f 指定脚本,可以把progrem中很多的命令写入到文件中使用-f直接调用 -v给变量赋值 ‘progrem’可以分为四段 第一段是匹配,被模式匹配到的行才会被处理 第二段是BEGIN段,在操作文件前执行的命令,一般用作给文本打表头,格式如:awk ‘BEGIN{print0}’ 第三段是对文本操作段,倘若不写是打印整行,命令格式:awk ‘{print $0}’ 第四段是END段,是文件操作后执行的命令,命令格式:awk ‘END{print 0}’ file
2 匹配和输出
既然是文本操作,那么必须具有匹配字符的能力,awk的匹配能力远大于sed,之所以这么说是因为,awk不仅可以进行行匹配还可以进行字段匹配,字段匹配可以大大降低匹配难度并且可以提高匹配精度。awk的匹配使用的拓展正则表达式。格式如下:
/peter/这是行匹配
$5~ /peter/ 这是字段匹配
awk有两个输出的命令,一个是print,一个是printf,printf可以一特殊的格式输出,也是其强大的制表功能的基本。
awk‘BEGIN{a=1;b=2;c=3print a,b,c}’ awk'BEGIN{a=1;b=2.2;c=3.3;printf "%d %10.3f %-10.3f\n",a,b,c}' printf和大多数的编程语言的输出语法类似 %d输出整数 %f输出浮点数(小数) %s输出字符串 %c输出字符 %%输出%自身 -10.3的含义是输出的内容总共占10个字符,保留三位小数,-代表左对齐,不带-代表右对齐。
3 变量和数组
变量分为系统的变量和自定义变量首先说自定义变量和数组,自定义变量可以通过-v定义也可以在progrem中定义。通过-v定义的格式
awk-v tom=200 ‘BEGIN{print tom}’
在progrem中定义变量的格式
awk‘BEGIN{tom=200;print tom}’
awk中自定义变量可以不定义直接使用,数组也是如此a[tom]=200。变量没被赋值就引用的话,变量的值为空,做算术运算时,未赋值变量的值为0。
awk常用的系统变量有以下几个
FS指定输入分割符和- F的功能相同 OFS输出分隔符 NF字段数,被分隔符分割的字段数 NR行号 FNRawk可以接受多个文件输入,这里记录行号是每个文件分开记录,NR是不分开记录 RS指定输入换行符,不使用原本的回车符,使用指定的字符为换行符 ORS指定输出分割符
4 变量操作
awk变量操作就极其简单了,直接使用操作符就可以了。格式如下
awk‘BEGIN{print 1+2}’
常用算术操作符有如下几个
+,-,*,/,%,^,++分别对应加减乘除取余次方自加 常用比较操作符 >,>=,<,<=,==,!= 模式匹配 ~,!~ =~ 左边能否被右边的peter匹配到,注意peter格式,在if语句中也要如此使用和bash的[ ]不同不要记混了:/peter/
5 控制语句
判断语句格式:
awk‘BEGIN{if(1 < 2)print 1}’ awk‘BEGIN{if(1 ~ /[[:digit:]]/){c=1+2;print c}}’ 循环语句格式: awk‘BEGIN{for(i=1;i < 3;i++)print 1}’ awk‘BEGIN{while(i<3){print i;i++}}’ awk‘BEGIN{do{print i;i++} while(i<3)}’ 这里也支持break终止循环 continue跳出本次循环
6 调用bash命令
awk‘BEGIN{system(“hostname”)}’
总结
awk还有很多奇怪的用法,这里只总结一点基本用法,主要熟练awk的输出和匹配,对文本的操作就解决了,简单使用数组、运算符和控制语句就可以对数据进行处理了。
转载于:https://blog.51cto.com/oldking/1881537