AWK简介
- awk是一款文本信息的统计,报告生成的工具.awk有自己的语法,是一款独立的编程语言.
- awk支持从文本文件中读取内容,或者从标准的输入中读取内容.
- awk 的最终起源于行编辑器ed,awk继承了行编辑器的特点,循环的读取文本的每一行(或者是分隔符分割的每一段文本)直至文本结束,但是awk加入了段分割符的概念.将每次读入的行进行再次分割.awk每次读取的行都只是未经过awk语句处理的对象。或读取行后会根据段分割符在将行分成多个对象。结构近似数组,然后进行指定语句的操作
- awk 的对命令的处理可以称为命令的解释,或脚本语言的解释。 awk的语句书写格式,属于模块化风格,特别是if,else语句表现的特别明显有点类似于bash中的匿名函数。每个语句块必须使用{}进行约束
awk的基本执行过程:
- 执行BEGIN语句块中的内容,语句为可选语句.多用于执行变量的初始化,报表的头输出.
- 从标准输入或文件中读取行分割符(-F定义的字符)分割的行进入内存,进行语句之前的条件匹配,在没有条件时默认为符合执行条件.符合条件执行,不符合条件则尝试匹配下一个语句之前的条件.直至所有条件匹配全部完成.当语句为空时默认执行{print $0}
- 继续读取下一行,直至末尾
- 执行END定义的语句内容,同样也为可选语句.多用于报表的统计信息输出.
基本格式 :
awk 选项
条件
语句
文件
- 在bash命令行中执行awk时,在向awk传入语句时,语句优先由bash优先解释。也就是说可以向awk传入语句时可以,bash展开传入一些奇怪的东西,比如说系统变量,比如说{1..4}
- 选项:
-f 从文件中读取处理命令
-F 指明行的段分隔符;分割针对输入时的数据。支持模式匹配。扩展的正则表达式,目的是将行分割成为多个对象.或确定每次循环时待处理的对象(最小待处理单位)是什么.默认的
-v 自定义变量
awk -v
- 条件:
awk是一门语言,请以编程的视角去看待条件。
条件为执行条件后的语句的要求。符合条件才可执行语句,条件即为对语句的判断,可以使用正则匹配,基于正则的模式定界,字符串比较,可以使用算数条件表达式,也可以是BEGIN,END特殊条件。
算数条件表达式,最终返回运算结果,当运算结果为0时,语句不执行。
在进行条件验证时行已经被分割成最小的单位,并已经对最小单位的小数量,内容,行号等信息进行了统计。
- 当条件为空时执行每一行
例:正则_匹配正则匹配的每一行
awk '/^UUID/{print $1}' /etc/fstab #匹配以UUID为开始的行,并执行{}中的语句。print $1
awk '!/^UUID/{print $1}' /etc/fstab #匹配以非UUID为开始的行,执行{}中的语句 。print $1
例:算数计算_条件为真该行才会被处理 ,条件 为假则不处理 。
awp -F: '$3>=1000{print $1,$3}' /etc/passwd
awp -F: '!$3>=1000{print $1,$3}' /etc/passwd
awk -F: '(NR>=2&&NR<=10){print $1}'
例:字符串比较_比较结果为真进入循环
awk -F:'$NF="/bin/bash"{print $1,$NF}' /bin/passwd
awk -F:'$NF~/bash$/{print $1,$NF}' /bin/passwd
awk -F: '! ($NF=="/bin/bash")' /etc/passwd
例:行范围_范围内的行做处理 ,好像只支持模式定界
awk -F:'10,20{print $1}' #----失败了
awk -F:'/^root/,/^myuser/{print $1}'
例:特殊条件_BEGIN/END
awk 'BEGIN{print " username ID \n------------"}{printf "%10s:%-s" $1,$3}END{print "=========\n"}'
# BEGIN:在开始之前显示一次
# END:在文本处理完成 ,命令未完成时,执行一次
例:特殊条件_0,空
awk -v aa="" 'aa' /etc/passwd #变量aa的值为空 ,(语句为空执行默认语句)。但是条件为空,不执行默认语句。
awk -v aa=" " 'aa' /etc/passwd #变量aa的值为‘ ’空格不为空执行默认语句
awk -v aa="0" 'aa' /etc/passwd #变量aa的值为0,条件为最终值为0,默认语句不执行。
awk -v aa=