1. awk的工作流程 :
awk命令的基本语法如下:
awk pattern { actions }
在上面的语法中,pattern表示匹配模式,actions表示要执行的操作。以上语法表示,当某个文本行符合pattern指定的匹配规则时,执行actions所执行的操作。在上面的语法中,pattern和actions都是可选的,但是两者必须保证至少有一个。如果省略匹配模式pattern,则表示对所有的文本行执行actions所表示的操作;如果省略actions,则表示将匹配成功的行输出到屏幕。
在awk处理数据时,它会反复执行以下4个步骤:
1>. 自动从指定的数据文件中读取行文本。
2>. 自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量$1、$2等等。
3>. 依次执行程序中所有的匹配模式及其操作。
4>. 当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有未读取的数据行,则返回到第(1)步,重复执行(1)~(4)的操作。
2. awk程序执行方式:
1>.通过命令行执行awk程序,语法如下:
awk 'program-text' datafile
2>.执行awk脚本。在awk程序语句比较多的情况下,用户可以将所有的语句写在一个脚本文件中,然后通过awk命令来解释并执行其中的语句。awk调用脚本的语法如下:
awk -f program-file file ..
在上面的语法中,-f选项表示从脚本文件中读取awk程序语句,program-file表示awk脚本文件名称,file表示要处理的数据文件。
3>.可执行脚本文件。在上面介绍的两种方式中,用户都需要输入awk命令才能执行程序。除此之外,用户还可以通过类似于Shell脚本的方式来执行awk程序。在这种方式中,需要在awk程序中指定命令解释器,并且赋予脚本文件的可执行权限。其中指定命令解释器的语法如下:
#!/bin/awk -f以上语句必须位于脚本文件的第一行。然后用户就可以通过以下命令执行awk程序:awk-script file
其中,awk-script为awk脚本文件名称,file为要处理的文本数据文件。
3. awk的输出 :
1>. print的使用格式:
print item1,item2,...
要点:
1. 各项目之间使用逗号隔开,而输出时则以空白字符分隔;
2. 输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;
3. print命令后面的item可以省略,此时其功能相当于print $0, 因此,如果想输出空白行,则需要使用print “”。
示例:
[root@localhost ~]# awk 'BEGIN{print "This","is","test"}'This is test
2>. printf命令的使用格式:
printf(format, [arguments])
其中圆括号是可选的,第1个参数format是一个用来描述输出格式的字符串,通常以引号括起来的字符串常量的形式提供。arguments为一个参数列表,表示用来显示的数据,可以是变量名等,多个参数之间用逗号隔开。参数列表的项是有顺序的,与前面的格式化字符串中的格式说明相对应。printf语句不会自动打印换行符。
1、其与print命令的最大不同是,printf需要指定format;
2、format用于指定后面的每个item的输出格式;
3、printf语句不会自动打印换行符;\n
format格式的指示符都以%开头,后跟一个字符;如下:
%c: 显示字符的ASCII码;
%d, %i:十进制整数;
%e, %E:科学计数法显示数值;
%f: 显示浮点数;
%g, %G: 以科学计数法的格式或浮点数的格式显示数值;
%s: 显示字符串;
%u: 无符号整数;
%%: 显示%自身;
修饰符:
N: 显示宽度;
-: 左对齐;
+:显示数值符号;
示例:
[root@localhost ~]# awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd |head -n 3root 0bin 1daemon 2
4. awk操作符 :
1>. awk支持常用的算术运算,这一点与其他的程序设计语言基本相同。
运算符
|
举例
|
+
|
1+2表示计算1和2的和
|
-
|
82-2表示计算82和2的差
|
*
|
2*5表示计算2和5的积
|
/
|
6/3表示计算6和2的商
|
%
|
5/2表示计算5除以2的余数
|
^
|
2^3表示计算2的3次方
|
示例:
[root@localhost ~]# awk 'BEGIN{x=2;y=3;print x**y,x^y,x*y,x/y,x+y,x-y,x%y}'8 8 6 0.666667 5 -1 2
2>. 赋值运算符
运
算
符
|
说明
|
=
|
赋值运算
|
+=
|
复合赋值运算,表示将前后两个数值相加后的和赋给前面的变量
|
-=
|
复合赋值运算,表示将前后两个数值相减后的值赋给前面的变量
|
*=
|
复合赋值运算,表示前后两个数的乘积赋给前面的变量
|
/=
|
复合赋值运算,表示前后两个数值的商赋给前面的变量
|
%=
|
复合赋值运算,表示将前面的数值除以后面的数值所得的余数赋给前面的变量
|
^=
|
复合运算符,表示将前面的数值的后面数值次方赋给前面的变量
|
3>. 条件运算符:
awk中的条件运算符只有一个,其语法如下:
expression?value1:value2
这是一个三目运算符,当表达式expression的值为真时,返回值为value1;否则,返回值为value2。
4>. 逻辑运算符 :
运
算
符
|
说明
|
&&
|
逻辑与,当前后两个表达式的值全部为真时,其运算结果才为真
|
| |
|
逻辑或,前后两个表达式只要有一个为真,则其运算结果为真。当两个表达式的值都为假时,其运算结果才为假
|
!
|
逻辑非,当表达式的值为真时,其运算结果为假;当表达式的值为假时,其运算结果为真
|
5>. 关系运算符:
运算符
|
说明
|
>
|
大于
|
>=
|
大于或者等于
|
<
|
小于
|
<=
|
小于或者等于
|
==
|
等于
|
!=
|
不等于
|
~
|
匹配运算符
|
!~
|
不匹配运算符
|
示例:
[root@localhost ~]# awk -F: 'BEGIN {printf "%-10s %-5s %-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-10s %-5s%-15s\n",$1,$3,$7}' /etc/passwduser uid shellroot 0 /bin/bashbin 1 /sbin/nologin
6>. 其他运算符:
awk还支持其他的一些运算符,例如正号+、负号-、自增++以及自减--等,这些运算符的使用方法与其他的语言的使用方法完全相同。