1.awk语法格式
awk [options] 'commands' filename awk [options] -f awk-script-file filenamesBEGIN行处理前动作 {}行处理 END行处理后动作BEGIN{print 1/2} {print "ok"} END{print "Over"}如:awk 'BEGIN{print 1/2} {print "ok"} END{print "Over"; print "Over2"}' /etc/passwd匹配awk 'pattern' filenameawk '/root/' /etc/passwd处理动作awk '{action}' filenameawk -F: '{print $1}' /etc/passwd匹配+处理动作awk 'pattern {action}' filenameawk 'BEGIN{FS=":"} /root/ {print $1,$3}' /etc/passwd加判断语句df | awk '/\boot/ {if ($2 < 300000) {print "1"} else {print "2"}}'
2. awk的工作原理
awk将文件中的每一行作为输入,awk会将每一行赋给内部变量$0,以换行符结束
awk开始进行字段分解,每个字段存储在已编号的变量中,从$1开始【默认空格分割】
awk默认字段分隔符是由内部FS变量来确定,可以使用-F修改
awk行处理时使用了print函数打印分割后的字段
awk在打印后的字段加上空格,因为$1,$3之间有一个逗号,逗号被映射至OFS内部变量中,称为输出分隔符,OFS默认为空格
awk输出后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分割成字段并进行处理,该过程将持续到所有行处理完毕。
3.awk分隔符
指定分隔符,一个冒号为分隔符 awk -F ":" '{print $1}' tmp 指定多个分隔符,一个冒号或一个空格为分隔符 awk -F "[: ]" '{print $2}' tmp 一个或多个冒号,空格为分隔符 awk -F "[: ]+" '{print $2}' tmp eg 取ip ifconfig | awk -F "[ :]+" '/\<inet\>/{print $4}'OFS 指定输出时,逗号映射的内容,默认为空格awk -F ":+" 'BEGIN{OFS="-----"}{print $1,$2,$3}' /etc/passwd
4. awk内置变量
一行多少个元素 NF awk '{print NF}' tmp awk '{print $NF}' tmp awk '{print $(NF-1)}' tmp
NR 行号 awk '{print NR}' tmp awk 'NR==1{print $0}' tmp awk 'NR!=1{print $0}' tmpawk 'NR>=1&&NR<=5{print $0}' tmpFNR 也是行号,当处理多个文件时,文件分开计数awk '{print FNR}' tmp1 tmp2
5.模式匹配
正则 ~符号表示匹配,后面加正则,正则内容使用‘/’包括 awk '/^root/' tmp awk '$0 ~ /^root/' tmp awk ‘$1~/^root/’ tmp 比较符 awk '$1 == /bin/bash' tmp awk '$1 < 10' tmp 条件表达式 awk '{if ($1 < 1000) {print "1"} else {print "2"}}' tmp 运算 awk '$1*1000 > 2000' tmp awk '{print $1+100}' tmp 逻辑运算 awk '$1<100 && $2 >2000' tmp
6. if
awk '{if ($1<100) {i++} else if ($2>200) {j++} else if ($3>100) {k++} else {n++}} END{print "i="i,"j="j,"k="k,"n="n}' tmp.log
7.while
awk 'BEGIN{i = 1; while(i<=10){print i; i++}}' tmp
8.for
awk -F: '{for (i = 1; i< 10; i++) {print $0}}' passwd
来源:https://www.cnblogs.com/yangxinrui/p/12412005.html