awk是一个非常强大的文本报告生成器,用于输出格式化文本输出。
awk:是由Aho,Weinberger,Kernighan三个人名命名
基本用法:
swk [options] 'program' file
program:PATTERN{ACTIONSTATEMENTS}
语句之间用分号分隔
选项:
-F:指明输入时用到的字段分隔符
-v var=value:自定义变量
输出命令:
1、print
print 项目1,项目2...
要点:
1、逗号做分隔符
2、输出的各项目可以是字符串、数值、当前记录的字段、变量或awk的表达式
3、如果省略项目,则相当于print $0:显示整行
2、变量
内建变量
FS:输入字段分隔符,默认为空白字符
OFS:输出字段分隔符,默认为空白字符
RS:输入时的换行符
ORS:输出时的换行符
NF:字段数量
{print NF}:显示字段数,{print $NF}:显示最后一个字段
NR:文件行数,每行计数一次,多文件累积计数
FNR:多个文件分别计数
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存命令行所给定的各参数
自定义变量
1、-v var=value
变量名区分大小写
2、在program中直接定义
3、printf命令
格式化输出:printf 格式符,项目1,项目2...
1、格式符必须要给出
2、不会自动换行,需要显式给出换行控制符,\n
3、格式符中需要分别为后面的没一个项目指定一个格式化符号
格式符:
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:科学计数法数值显示
%f:显示为浮点数
%g,%g:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
修饰符:
#[.#]:第一个数字控制显示宽度;第二个数字表示小数点后精度
-:左对齐
+:显示数值的符号
4、操作符
算术操作符
+,-,*,/,^,%
-x:使数值变为负数
+x:字符串转变为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符
=,+=,-=,*=,/=,%=,^=
++,--
比较操作符
>,>=,<,<=,!=,==
模式匹配符
~:是否匹配
!~:是否不匹配
逻辑操作符
&&
||
!
函数调用:
函数名(参数1,2,...)
条件表达式:
条件表达式?为真执行语句:为假执行语句
5、PATTERN
1、empty:控模式(可以不加),匹配每一行
2、/正则表达式/:仅处理正则表达式匹配到的行
3、关系表达式:结果为“真”才会被处理
真:结果为非0值,非空白字符串;
4、/pat1/,/pat2/:地址定界(不支持直接给出数字)
5、BEGIN/END模式:
BEGIN{}:仅在开始处理文本之前执行一次;
END{}:仅在文本处理完成之后执行一次;
6、常用的action
1.表达式
2.控制语句:if,while等
3.组合语句
4.输入语句
5.输出语句
7、控制语句
1.if-else
语法:if(condition) statement [else statement]
使用场景:对awk取得的整行或某个字段做条件判断
显示系统中的所有用户是系统用户还是普通用户
awk -F: '{if($3>=1000) {printf "Common user:%s\n",$1} else {printf "root or Syuser: %s\n",$1}}' /etc/passwd
2.while循环
语法:while(condition) statement
条件“真”,进入循环;条件“假”,退出循环;
使用场景:对一行内的多个字段逐一类似处理时试用;对数组中的各元素逐一处理时使用;
显示字段字符个数
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg
3.do-while循环
语法:do statement while(condition)
意义:至少执行一次循环体
4.for循环
语法:for(初始变量;变量赋值;控制修正) statement {for-body}
显示字段字符个数
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
5.switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE1 or /REGEXP/:
statement;...;default: statement}
6.break和continue
break [n]
continue
7.next
提前结束对本行的处理直接进入下一行;
8.array
关联数组:array[index-expression]
index-expression:
1.可使用任意字符串;字符串要使用双引号;
2.如果某数组元素事先不存在,在引用时,awk会自动创建此元素,
并将其值初始化为“空串”;
若要判断数组中是否存在某元素,要使用“index in array”格式进行
若要遍历数组中的每个元素,要使用for循环
for(var in array) {for-body}
netstat -tan | awk -tan '/^tcp\>/{state[$NF]++}END{for(i in state) {print i,state[i]}}'
9、函数
1. 内置函数
数值处理
rand():返回0~1之间的一个随机数
字符串处理:
length([s]):返回指定字符串的长度;
sub(r,s[,t]):以r表示的模式来查找t所表示的字符串中的匹配内容,并将
其第一次出现替换为s所表示的内容;
gsub(r,s[,t]):以r表示的模式来查找t所表示的字符串中的匹配内容,并将
其所有出现替换为s所表示的内容;
split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;
2. 自定义函数