Linux三剑客grep,sed,awk及使用介绍(3)

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/passwd

3) $#~/指定内容/

这种方式用于指定列模糊匹配(正则匹配)指定内容,并获取该行。

awk -F: '$1~/dae/{print $1}' /etc/passwd #正向选择 awk -F: '$1!~/dae/{print $1}' /etc/passwd #反向选择

4) 值判断

使用>,<,>=,<=,==,!=来判断指定列的值。

awk -F: '$3>=10{print $1}' /etc/passwd

5) 逻辑判断

使用&&,||来进行逻辑判断。

awk -F: '$3>=5 && $3<=10{print $1}' /etc/passwd

6) 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11665.html