awk使用详解
格式:awk [OPTIONS] ‘pattern + {action}’ file
1、[OPTIONS]
- -F:指明输入时用到的字段分隔符
- -f:运行awk脚本文件
- -v var=value:自定义变量
2、基本语法参数
-
单引号’’:为了和shell命令区分开
-
大括号{}:表示一个命令分组
-
pattern:过滤器,表示只有经pattern匹配的内容才进行action处理
-
action:处理动作,常用的动作为print
-
#:注释,pattern和action可以只有其一,但不能两者都没有
3、变量
(1)、内置变量
- FS:输入分隔符,默认是空格
- OFS:输出分隔符,默认是空格
- NR:当前行数,从1开始
- FNR:各文件分别计数,行数
- NF:当前记录的字段数
- RS:输入时的换行符
- ORS:输出时的换行符
- FILENAME:当前文件名
- $0:当前所有记录
- $1~$n:当前记录第n个列
- ARGC:命令行参数的个数
- ARGV:数组,保存的是命令行所给定的各参数
(2)、自定义变量
- -v var=value:定义变量
- 在{pattern+action}中定义变量
4、操作符
(1)、算数操作符
+ - * / ^ %
(2)、字符串操作符
没有符号的操作符,字符串连接
(3)、赋值操作符
=、+=、-=、*=、/=、%=、^=、++、–
(4)、比较操作符
>、<、>=、<=、!=、==
(5)、模式匹配符
~:是否匹配
!~:是否不匹配
(6)、逻辑操作符
&&、||、!
(7)、函数调用
function_name(arg1,arg2,…)
(8)、条件表达式
条件表达式?条件为真语句:条件为假语句
eg:awk -F: ‘{$3>=1000?usertype=“Common User”:usertype=“Sysadmin User”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd
5、PATTERN
- empty:空模式,匹配每一行
- /regular expression/:处理被此处正则匹配到的行
- /relational expression/:关系表达式 eg:’$7=="/bin/bash"’
- line ranges:行范围(不能直接用数字表示,可用条件匹配确定行范围
eg:awk -F: ‘(NR>=2&&NR<=10){print}’ /etc/passwd - BEGIN{}:仅在文件开始处理文本前执行一次
- END{}:仅在文本处理后执行一次
6、常见的action
(1)、表达式
(2)、条件控制语句
(1)、if语句
if(condition){} else {};
(2)、while语句
while(condition){};
(3)、do…while语句
do{} while(condition);
(4)、for语句
for(init;condition;step){};
(5)、break/continue语句
break:结束循环
continue:跳出当前层循环
(6)、switch语句
switch(expression){case VALUE1 or /REGEXP1/:{};case VALUE2 or /REGEXP2/:{};…;default:{}}
(7)、next语句
作用:提前结束对本行的处理而直接进入下一行
eg:awk -F: ‘{if($3%2!=0) next;print $1,$3}’ /etc/passwd
(3)、组合语句
(4)、输入语句
(5)、输出语句
7、数组
关联数组:array[index-expression]
index-expression:
- 可使用任意字符串,字符串要使用双引号
- 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为"空串"
判断数组中是否存在某元素: index in array
eg:
awk ‘BEGIN{weekdays[“mon”]=“Monday”;weekdays[“tue”]=“Tuesday”;weekdays[“wes”]=“wednesday”;if (“mon” in weekdays) {print “yes”} else{print “no”}}’
遍历数组中的每个元素:for(var in array) {}
eg:
awk ‘BEGIN{weekdays[“mon”]=“Monday”;weekdays[“tue”]=“Tuesday”;weekdays[“wes”]=“wednesday”;for (i in weekdays) {print weekdays[i]}}’
state[“LISTEN”]++ :state数组下标为LISTEN的结果数量加1
state[“ESTABLISHED”]++
eg:netstat -tan | awk ‘/^tcp>/{state[$NF]++}END{for(i in state) {print i,state[i]}}’
8、函数
- rand():返回0和1之间的一个随机数
- length(s):返回s字符串的长度
- gsub(r,s):在$0中用s代替r
- index(s,t):返回s中t的第一个位置
- match(s,r):s是否匹配r
- split(s,a,fs):在fs上将s分成序列a
- substr(s,p):返回s从p开始的字串
9、printf:格式化输出结果
print FORMAT,item1,item2,…
- FORMAT必须输出
- 不会自动换行,需要显示给出换行控制符,\n
- FORMAT中需要分别为后面每一个item制定一个格式化符号
FORMAT格式符
- %c:显示字符的ASCII码
- %d,%i:显示十进制整数
- %e,%E:科学记数法数值显示
- %f:显示为浮点数
- %g,%G:科学记数法或浮点形式显示数值
- %s:显示字符串
- %u:显示无符号整数
- %%:显示%本身
- %n.nf:第一个n控制显示的宽度,第二个n表示小数点后的精度
- -:左对齐
- +:显示数值的符号
eg:awk -F: ‘{$3>=100?usertype=“Common User”:usertype=“Sysadmin User”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd