awk使用方法
awk '{pattern + action}' {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。awk支持所有的正则表达式元字符。
awk有2个特殊的段,BEGIN,END,分别用于主循环的前后。
调用awk的3种方式
awk '{pattern + action}' {filenames}
awk -f awkfile filenames
file.awk filenames
记录和域
awk的一行文本称作一个记录。awk通过分隔符,把一行文本分成多个域。域从1开始编号,$1,$2分别表示第一,第二个域,$0表示所有域。
$后面可以跟变量或者表达式,例如$(a+b)
awk可以通过-F指定分隔符,或者在BEGIN段内使用FS=char指定分隔符。
关系和布尔表达式
运算符 | 意义 |
---|---|
< | |
> | |
<= | |
>= | |
== | |
!= | |
~ | 匹配正则表达式 |
!~ | 不匹配正则表达式 |
|| | |
&& | |
! |
表达式
awk可以定义变量,awk变量区分大小写。awk变量无需定义类型,每个变量有2种类型,数值和字符串值,根据上下文决定使用什么类型。默认数值为0,字符串值为空。
x=1 #x=1
z="very" "good" #z=very good
awk运算符
运算符 | 意义 |
---|---|
+ | |
- | |
* | |
/ | |
% | |
^ 或 ** | 乘方 |
++x | |
x++ |
系统变量
变量 | 意义 |
---|---|
$0 | 当前记录(作为单个变量) |
$1~$n | 当前记录的第n个字段,字段间由FS分隔 |
FS | 输入字段分隔符 默认是空格 |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始 |
RS | 输入的记录他隔符默 认为换行符 |
OFS | 输出字段分隔符 默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
ARGC | 命令行参数个数 |
ARGV | 命令行参数数组 |
FILENAME | 当前输入文件的名字 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
ARGIND | 当前被处理文件的ARGV标志符 |
CONVFMT | 数字转换格式 %.6g |
ENVIRON | UNIX环境变量 |
ERRNO | UNIX系统错误消息 |
FIELDWIDTHS | 输入字段宽度的空白分隔字符串 |
FNR | 当前记录数 |
OFMT | 数字的输出格式 %.6g |
RSTART | 被匹配函数匹配的字符串首 |
RLENGTH | 被匹配函数匹配的字符串长度 |
SUBSEP | 数组下表分隔符。\034 |
格式化输出
printf (格式控制符,参数)
控制符 | 意义 |
---|---|
修饰符 | 意义 |
- | 左对齐 |
width | 域宽度 |
.prec | 小数位数 |
- | - |
格式符 | 意义 |
%c | |
%d | |
%u | 无符号整数 |
%e | 浮点数,科学计数法 |
%f | |
%s | |
%x | 十六进制 |
%o | 八进制 |
%g | 自动选择合适的表示法 |
%p | 指针的值。 |
向脚本传递参数
awk脚本内的变量,可以在命令中传递,使用-v
scr.awk -v paramname=paramvalue files
条件语句和循环语句
awk条件语句与循环语句与C语言一样。
if (expression)
{statements}
[
else
{statements}
]
#[]表示可选。if允许嵌套。语句后可以跟;表示结束。
while(expression)
{
statements
}
do
{
statements
} while(expression)
for(var in list)
{
}
for(;;)
{
}
数组
数组格式与C一样,不过不用定义类型与大小。
1、关联数组
关联数组即数组下标可以是表达式,数值,字符串。
字符串与数值是有差异的。array[09]与array[9]不是一个地址。