简介
awk是一个强大的文本分析工具,它认为文本都是结构化的,它将每一个输入行定义为一个记录, 每行中的每个字符串定义为一个域(段),域和域之间用分隔符分隔。
功能:流程控制,数学运算,进程控制,内置的变量和函数,循环和判断。
工作原理
awk采用“行工作模式”,将文件一行行的读入,并进行拆分处理。
- 读入一行(一条记录),将其存入内置变量$0中
- 使用段分隔符分隔这条记录(分隔符由内置变量FS指定,默认采用空格
" "
分隔),把分隔后的段顺序存入内置变量$(1-100) - 输出每个段的时候也可以通过内置变量OFS指定分隔符,默认也是空格
- 循环,读入下一行
常用内置变量
关于记录
$0 当前记录(作为单个变量)
NR 已经读出的记录数,即当前行号,Number of Row
RS 输入记录的分隔符,默认为换行符
ORS 输出记录的分隔符,默认也是换行符
FNR 当前记录数关于段
$1-$n 当前记录的第n个字段,字段间由FS分隔
NF 当前记录中域(字段)的个数,就是列号。Number of field
FS 输入字段分隔符,默认空格
OFS 输出字段分隔符,默认空格环境变量等
ARGC 命令行参数个数
ARGV 命令行参数数组
ARGIND 当前被处理文件的ARGV的标志符
FILENAME 当前输入文件名
CONVFMT 数字转换格式%.6g
IGNORECASE 若值为真,则进行忽略大小写的匹配
ENVIRON Unix环境变量
ERRNO Unix错误信息
FIELDWIDTHS 输入字段宽度的空白分隔字符串
RESTART 被匹配字符串的字符串首
RLENGTH 被匹配字符串的字符串长度
awk的使用(大部分与C语法一致)
正则表达式
.*^$?+[]<>()
不支持() {}
关系运算符
<>
!=
=
<=
~匹配
!~不匹配
大部分与C语言一致
逻辑运算符
&& || !(与 或 非),这里与C语言语法一致
算术运算符
- / % ^(加 减 乘 除 取模 幂运算),这里与C语言语法一致
BEGIN END
BEGIN{动作1;动作2;…} 在处理文件之前,要执行的动作;只执行一次。
用于给文件添加标题,定义变量,定义文件的分隔符等
END{动作1;动作2;…} 在处理完文件之后,要执行的动作;只执行一次。
汇总的操作
流程控制
表达式语句:(表达式?值1:值2),if判断,if-else, for,while等语法与C语言几乎一致,在此不过多叙述了。
next表示处理输入行的下一行
exit退出
一个awk中数组使用的例子
文本文件array1内容如下:
BEGIN{
a[1]="a1";
a[2]="a2";
a[3]="a3";
for ( i = 1; i <= 3; i++)
print "数组a["i"]的值是"a[i]
}
终端输入命令:$ awk -f array1
,输出如下
数组a[1]的值是a1
数组a[2]的值是a2
数组a[3]的值是a3
一些内置函数
split切割字符串
split(“待切割字符串”,数组名,”切割用的分隔符”)
toupper 与 tolower
大小写转换
sub与gsub
局部替换与全局替换
sub(/要替换的内容/,”替换成什么内容”)
gsub(/要替换的内容/,”替换成什么内容”)
gsub(/要替换的内容/,”替换成什么内容”,指定字段)
length
计算字符串长度
数学函数:sin,cos,int,sqrt等
print打印到终端
eg:打印当前系统变量的某个特定值
$ awk 'BEGIN{print ENVIRON["PATH"];}'
printf 格式输出
格式控制符与C语言基于一致,%o
以无符号八进制表示的整数,%g
以科学计数法或浮点数的格式显示数值,%%
显示其自身。
修饰符:
-:左对齐
+:显示数值符号
N:显示
-F 指定段的分隔符
说明:
对于小数取保留位的时候,最低位进行四舍五入,而取整的时候,直接舍去小数部分。
总结
- 需要记住一些内置变量,如NR表示行号(记录),NF表示列号(域)
- 其实看完这些,还是并没有会用吧,哈哈,还是得多实践吧!