awk

1.awk语法格式

 

awk [options] 'commands' filename
awk [options] -f awk-script-file filenames

BEGIN行处理前动作   {}行处理      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' filename
awk '/root/' /etc/passwd

处理动作
awk '{action}' filename
awk -F: '{print $1}' /etc/passwd

匹配+处理动作
awk 'pattern {action}' filename
awk '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}' tmp

awk 'NR>=1&&NR<=5{print $0}' tmp

FNR 也是行号,当处理多个文件时,文件分开计数
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

 

posted on 2020-03-04 21:45  开心种树  阅读(191)  评论(0编辑  收藏  举报