六周第三次课(4月27日)笔记

9.6/9.7 awk

awk工具

六周第三次课(4月27日)笔记

awk支持分段匹配

awk指定分割符并打印出来:awk -F ':' '{print $1}' xxx.txt

六周第三次课(4月27日)笔记

六周第三次课(4月27日)笔记

awk 指定分隔符把所有内容打印出: awk -F ':'{print $0}' xxx.txt 或者直接 awk '{print $0}'  xxx.txt

六周第三次课(4月27日)笔记

六周第三次课(4月27日)笔记

如果不指定分隔符,默认以空白或者空格作为分隔符,测试结果如下:

六周第三次课(4月27日)笔记

打印多段内容时,只需要在其中加上逗号

六周第三次课(4月27日)笔记

如果想在字符中间以指定符号作为分隔符,以#为例加“#”即可

六周第三次课(4月27日)笔记

awk实现查找无需加多余字符,以/oo/为例 awk '/oo/' xxx.txt

同样支持正则表达式,且分段式搜索如:  awk -F ':' '$1 ~/o+/' xxx.txt; awk -F ':' '$1 ~/oo+/' xxx.txt

六周第三次课(4月27日)笔记

awk可执行多个操作(以root/user, test.txt为例): awk -F ':' '/root/ {print $1,$2,$3} /user/ {print $1,$3,$4}' test.txt

使用egrep/grep -E查看含有root/user的行  egrep/grep -E 'root|user' test.txt

六周第三次课(4月27日)笔记

awk -F ':' '/root|user/ {print $0}' test.txt== grep -E 'root|user' test.txt  区别仅仅在颜色

六周第三次课(4月27日)笔记

awk命令同样可以结合数学运算,如==,>=,<=,!= (特别注意:以1000为例,加上双引号"",系统会认为是一个字符串,在对比查询中会以ASCII码表中的编码进行大小对比,如果对比对象是数字本身无需添加双引号,如果是字符串需要加之)

六周第三次课(4月27日)笔记

六周第三次课(4月27日)笔记

awk$各段对比

六周第三次课(4月27日)笔记

六周第三次课(4月27日)笔记

列出第三段大于1000或者第七段等于/sbin/nologin的行

六周第三次课(4月27日)笔记

~匹配符,即:第三段大于1000或者第七段中包含/bash/的

OFS为内置变量,输出生效为print后的分隔符,代替-F ':',具体语法为:

awk -F ':' '{OFS="xx"} 条件句 {print $xxxx}'  xxx.txt

六周第三次课(4月27日)笔记

if语句

六周第三次课(4月27日)笔记

NR 行 NF段数和

awk -F '{print NR":"$0}' test.txt

awk -F '{print NF":"$0}' test.txt

六周第三次课(4月27日)笔记

六周第三次课(4月27日)笔记

NR, NF同样可以用于条件判断

'NR<=10': 列出行号小于等于10的行

'NR<=10 && $1 ~ /root|adm/' : 列出行号小于等于10且第一列中含有root或者adm的行

' {print $NR":"$NF}': 打印出所有行数字的列和段数列

六周第三次课(4月27日)笔记

赋值和等于的区别:顾名思义,前者是对某个指定变量进行赋值,后者是数学表达式中的相等

在awk中,如下图所示: $1=root把第一段都赋值给root;而等于号则是查找第一段等于root的行,OFS变量可以打印前先加上

六周第三次课(4月27日)笔记

awk求和

awk -F ':' '{(tot=total+$3)}; END {print tot}' filename

六周第三次课(4月27日)笔记