目录
awk 编程
awk编程模型
awk 调用方法
awk 编程的一组例子
awk模式匹配
下面是awk打印空白行的几种模式:(sed 修改和编辑文本文件中某些行,awk 是访问文本文件,操纵文本文件中某些数据)
-
命令调用: awk ‘/^$/{print “This is a blank line.”}’ input
-
插入脚本文件:
-
脚本文件:
脚本文件中,#!/bin/awk 指明awk路径, -f 指明是文本调用,后面的可以看做是命令调用中单引号中的内容。
记录和域
awk默认的分隔符是空格,此时Tab键被看做是连续的空格键来处理,我们可以使用awk的-F选项来改变分隔符:上面的第二个分隔符是Tab,我们换为Tab看看结果
此时的$3变为了号码列。
另一种改变分隔符的方法是使用awk环境变量FS,我们可以通过在BEGIN字段中设置FS的值来改变分隔符。
例如:源文件如下
关系和布尔运算符
~ : 正则匹配
if 、if /else、if/else else三种条件语句:if 条件需要用圆括号括起来。
注:使用 == 来精确匹配,使用 ~ 来模糊匹配是否含有指定字符串。
表达式
系统变量
格式化输出
格式控制符分为awk修饰符和格式符两种:
awk 的printf参照C语言的printf,基本语法为:
printf (格式控制符,参数)
内置字符串函数
向awk脚本传递参数
条件语句和循环语句
像C语言一样:
例子:
if (expression) {
statement;
statement;
... ...
}
if (expression) {
statement;
} else {
statement2;
}
if (expression) {
statement1;
} else if (expression1) {
statement2;
} else {
statement3;
}
统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is 8.22339 M
数组
因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
显示/etc/passwd的账户:
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
注意:NF是记录域的个数,NR是记录行的总行数。第一阶段由BEGAIN字段标识,定义了一个变量count并赋初值0;第二阶段是主输入循环,对输入的文件的每行进行处理;第三阶段由END标识,是读取文件完毕所执行的动作。
对应于上面查看数组中的结果:
awk 'BEGIN {FS=","} {split($1, name, " "); for(i in name) print name[i]}' students