print
输出格式:print item1,item2 ...
备注:使用逗号作为分隔符;输出item可以是字符串、內建变量、awk表达式;若省略item,则显示$0整行;
printf
格式化输出:printf FORMAT, item1, item2...按位放在format中。
注意事项:format必须要给出;如需换行,必须要显示写出;format中需要为后面每个item指定格式符;
Expressions
Control statements:控制语句if,while
if(condition){statement}
if(condition){statement} else {statements}
while(condition) {statements}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array删除整个数组
exit 退出语句
Compound statements:组合语句
Input statements:输入语句
Output statements:输出语句
格式符:
%c:显示字符的ASCII值
%d:显示十进制整数
%e:科学计数法数值显示
%f:显示为浮点数
%g:以科学计数法显示浮点数
%s:显示字符串
%u:显示无符号整数
%%:显示%自身
修饰符:
#[.#]:第一个数字用于控制显示字符的宽度,第二个数字表示小数的精度(对于浮点数而言);输出默认右对齐%15s,左对齐:%-15s;+:表示带正负符号;
操作符:
算数操作符:+-/* ; +x把字符串转换成数值;-x改成负数;
字符串操作符:字符串连接(没有操作符)
复制操作符:=,+=,-=,/=,++,--
比较操作符:>,<,<=,!=,==
模式匹配符:
~:左侧的字符串是否被模式匹配
!~:左侧的字符串是否不能被模式匹配
逻辑操作符:
&&:与
||:或
!:非
函数调用:
function_name(arg1, arg2, ...)
条件表达式:
selector?true_exp:false_exp 和三目运算符一样
操作例子
# 一般来说, 打印无状态内容放在BEGIN和END块中 awk -v begin="hello" -v end="ok" -F: 'BEGIN{print begin}; {print $1, $NF}; END{print end}' /etc/passwd 5.3. awk高级用法及举例awk常用内置变量
$1:表示第一列 $NF:表示最后一列 $NR:表示行号常用条件表示
1) /指定内容/
这种方式可以匹配到含有“指定内容”的行,在条件中不添加$#所带的项,建议不使用正则,有异常情况。
awk -F: '/nologin/{print $0}' /etc/passwd #匹配到含有nologin关键字的行 seq 100 | awk '/1/{print $1}'2) $#=/指定内容/
这种方式指定第#列匹配指定内容
awk -F: '$1=/bin/{print $0}' /etc/passwd3) $#~/指定内容/
这种方式用于指定列模糊匹配(正则匹配)指定内容,并获取该行。
awk -F: '$1~/dae/{print $1}' /etc/passwd #正向选择 awk -F: '$1!~/dae/{print $1}' /etc/passwd #反向选择4) 值判断
使用>,<,>=,<=,==,!=来判断指定列的值。
awk -F: '$3>=10{print $1}' /etc/passwd5) 逻辑判断
使用&&,||来进行逻辑判断。
awk -F: '$3>=5 && $3<=10{print $1}' /etc/passwd6) if条件判断
awk -F: '{if ($NF~/nologin$/){i++}else{j++}}; END{print i, j}' /etc/passwd #注意if-else条件判断是放在{}中的7) 字典使用
在awk中可以定义数组类型,用于统计。
awk '{ip[$1]++}; END{for (i in ip) {print i, ip[i]}}' access.log #解析: 将第一列ip设置为字典的key,当出现一次相同的ip时自增1,用于统计所有的ip计数。 #for循环中取到每个字典对应的key,再使用print块打印出来。注意花括号的隔离。 #QQ号 等级 时长 #统计等级(30<=x<=90),相同账号的时长 #1234 12 23 #1234 10 122 #1233 92 4212 #1233 42 4252 #1239 87 2313 #1233 56 1121 #1231 19 45 #1235 45 679 cat data | awk '$2>=30&&$2<=90{dic[$1]+=$3}; END{for (i in dic) {print i, dic[i]}}'Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx