简介:
grep、sed、awk为三个主流的文本处理器,但是在处理上各有优缺点。这里我们只介绍awk
AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
一、基本语法
awk [options] ‘program’ file file ..
awk [options] ‘PATTERN{action}’ file file…
输出格式:print item1,item2。。。
(1)各项之间用逗号分割,实现出来有空格;若用空格显示出来则无空格
(2)输出的各项可以字符串,当前记录字段,变量或awk的表达式;数值会被隐式转换为字符串后输出
(3)如果后面的print后面的item省略,相当于print $0:输出全部
===============================================================
二、awk的变量
主要分为内置变量和自定义变量
(1)内置变量
FS:Filed Seperator | 输入时的字段分割fu |
RS: | 输入行分割符 |
OFS | 输出时的字段分割符 |
ORS | 输出时的行分割符 |
NF | 字段数 |
NR | 行数,所有文件一并计数 |
FNR | 行数,各文件分别计数 |
ARGV | 数组保存命令本身的字符 |
ARGC | 保存awk命令参数的个数 |
FILENAME | awk正在处理的当前文件的名称 |
下面举例显示一下区别:
(a)使用不同的分割
(b)对文件行数计数
(c)对各文件分别计数
(d)使用数组保存命令本事的字符
(e)保存命令参数的个数
(f)显示awk当前正在处理的文件系统的名称
===============================================================
(2)自定义变量
-v var_name=VALUE //变量名区分字符大小写
a.可以在program中定义
b.可以在命令行通过-v选项自定义
三、awk的printf用法
使用格式:printf format, item1, item2….
要指定format
不会自动换行,换行需要使用\n
format用于为后面的每个item指定其输出格式
(1)format的格式的指示符以%开头,后面跟一个字符
%c | 显示字符的ASCII码 |
%d,%i | 十进制整数 |
%e | 科学计数法显示数值 |
%f | 显示浮点数 |
%g | 以科学计数法格式或浮点数格式显示数值 |
%s | 显示字符串 |
%u | 显示无符号整数 |
%% | 显示%自身 |
将字符转换为ASCII码
打印为十进制
讲某数转换为科学计数格式
打印字符串
以浮点数的方式计数
其他就不一一演示了
=====================================================
(2)awk的输出重定向
>, >>, |
特殊文件描述符:
/dev/stdin:标准输入
/dev/stdout:标准输出
/dev/stderr:错误输出
========================================================
(3)awk的操作符
算术操作符:+ ,-,*,**,%,正负值:+x,-x
字符串操作符:连接
赋值操作符:=,+=,-=,*=,/=,%=,^=,**=,++,--
如果模式自身是等号,要写为/=/
比较操作符:< <= > >= == !* ~ !~
逻辑操作符:&& ||
(4)条件表达式
selector?if-ture-ezpression:if-false-expression
条件?为真输出的内容:为假输出的内容
四、函数调用
function_name (argu1,argy2)
(1) Regexp:格式/PATTERN/ //仅处理被/PATTERN/匹配到的行
(2)Expression:表达式,其结果为非0或非空字符串时满足条件:
仅处理满足条件的行
(3)Ranges:行范围,此前地址定界,startline,endline
仅处理范围内的行
(4)BEGIN/END:特殊模式,仅在awk命令的program运行之前或运行之后执行一次
(5)Empty:空模式,匹配文件中的所有行
五、控制语句
(1) 格式:if (condition) {then body} [{else {else body}]
(2) 格式:while (condition) {while body}
#[[email protected] ~]# awk ‘{i=1;while (i>=NF) {if ($i>=20000) print $i;i++}}‘ test.txt
(3) 格式:do {do-while body} while (condition)
(4) 格式:for (variable assignment ; condition; iteration process) {for body}
#awk -F: ‘{for(i=1;i<=3;i++) { if (length($i)>=8) {print $i}}}‘ /etc/passwd
***for循环可以用来遍历数组元素;语法:for (i in array) {for body}
#awk -F: ‘$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%-15s:%i\n",A,BASH[A]}}‘ /etc/passwd
(5)switch (expression) {case VALUE or /RGEEXP/: statement1;...default: statementN}
(6) break continue 循环控制
(7)next,提前结束本行的处理注解进入下一行的处理
六、 awk对于数组的应用
关联数组
array[index-expression]
index-expression:可以使用任意字符串;如果某数组元素在引用时事先不存在,那么在引用时awk会自动创建此元素并初始化为空串,因此要判断数组是否存在该元素,必须使用index in array 这中格式
A[first]="hello awk"
print A[second]
要遍历数组中的每个元素,需要使用如下特殊结构
for (var in array) (for body)
其中var会遍历数组的索引
state [LISTEN]++
state [LISTEN]++
删除数组元素:需要从关系数组中删除数组的索引
delete array[index]
七、awk的内置函数
1、 split(string,array[,fieldsep[,seps]]);
功能:将string表示的字符串以fielfsep为分割符进行切片,并将结果保存在数组中,数组以1开
2、ength([string])
功能:返回string字符串中字符的个数;
substr(string, start [, length])
功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;
tolower(s)
3、能:将s中的所有字母转为小写
toupper(s)
功能:将s中的所有字母转为大写