简介
awk是一种编程语言,用于在linux\unix下对文本和数据的处理。
linux的三剑客:grep、sed、awk
- grep:更适合单纯的查找或者匹配文本
- sed:更适合编辑指定的文本
- awk:更适合格式化文本,对文本进行复杂处理
awk基础
awk处理模式
awk逐行处理文本,按照指定的分隔符(默认空格),将行分割为多个字段,每个字段按照顺序,分别对应到awk的内置变量中。分割完后,第一个字段为$1,最后一个为$NF,$0表示当前行。
-
注意: NF 和 $NF 不相同,NF表示当前行被分隔后,一共有多少个字段;$NF代表最后一个字段
image.png
基础语法
- awk [options] 'Pattern{Action}' file
awk内置变量
常用的内置变量:
- FS:Field sperator输入分隔符
使用举例:指定#为分隔符 awk -F# '{print $1,$2}' ; awk -v FS="#" {print $1, $2} - OFS: output field sperator 输出分隔符
使用举例:指定++为输出分隔符 awk -v OFS="++" '{print $1, $2}' - RS:record sperator,输入行分隔符,默认是换行符
使用举例: awk -v RS=" " {print NR, $0} - ORS:output record sperator,输出行分隔符,默认是换行符
使用举例: awk -v -ORS= " " {print $1, $2} - NF: number of field, 当前行被分割成立几列
- NR:number of record, 当前处理的行号(多个文件时会累加)
- FNR: file number of record,各文件分别的行号
- FILENAME: 当前文件名
- ARGC: numbers of command line arguments,命令行中给定参数的个数
- ARGV: arrays of command line arguments,一个数组,保存的是命令行中所给定的参数
举例: awk '{print ARGV[0], ARGV[1],ARGV[2],ARGC}' test1 test2
结果:awk test1 test2 2
awk Action之print
- 打印整行: awk '{print}' / awk '{print $0}'
- 打印多个内置变量或者字符: awk '{print $1, $2, 666, $3, "string"}'
awk Action 之printf 文本格式化
- printf输出的文本不会换行,需要在对应的格式替换法中加\n
- 指定格式和格式化的文本之间需要用,(逗号)隔开
- 格式替换符必须与被格式化的文本一一对应
- 使用举例:awk '{printf %5s %7.3d, $1, $2 }' : 第一个变量以字符填充,宽度5个字符,第二个变量以数字填充,7个字符宽度,精度为3位小数
awk Action之流程控制语句
- if...else :
cat /etc/passwd | awk -v FS=':' '{if ($3 > 500) {printf "%-15s %-15s\n", $1, "普通用户"} else {printf "%-15s %-15s\n", $1, "系统用户"}}' - for:awk 'BEGIN{for(i = 0; i < 6 ; i++) {print i}}'
- while: awk 'BEGIN{i = 2; while(i < 6) {print i; i ++}}'
- do..while: awk 'BEGIN{i = 2; do {print i; i++} while (i <6)}'
- continue:用法跟编程语言中一样
- break:用法跟编程语言中一样
- exit:用法跟shell中一样,注意的是,BEGIN模式的exit执行后不会跳过END中的语句
awk之Pattern
当awk逐行处理的时候,会把Pattern作为条件,判断要处理的行是否满足条件,满足则处理。
常用的模式分为几类:
- 空模式:没有写pattern,所有行都进行处理
-
关系运算模式:
image.png - 正则模式:把正则表达式当作模式,能匹配则算满足条件并执行响应的动作(awk使用扩展正则模式)
awk [Options] '/正则/{Action}'
举例: awk '/^[0-9]{2,6}/{print $0}' - 行范围模式:在指定的行范围内执行动作,可通过两种方式指定行范围:
正则: awk '/正则1/, /正则2/{Action}' 从匹配到正则1开始,到匹配到正则2结束;
关系运算模式:awk 'NR>=3 && NR <=6 {Action}' - 特殊pattern:
BEGIN: 指定了处理文本之前所需要的操作
END: 指定了处理文本之后所需要的操作
举例:awk 'BEGIN{print "name","age"} {print $1, $2} END{print "name","age"}'
awk内置函数
- 随机数: rand()和srand()配合使用,例如:生成(0,100)的随机数 awk 'BEGIN{srand(); print int(100*rand())}'
- 文本替换:sub()\gsub() 将所有小写的l替换成大写L awk '{gsub("l","L",$0); print $0}' ,只将第一个匹配的l替换成L awk '{sub("l","L",$0) ; print $0}'
- 获取字符串的长度:awk '{print length($1)}' ,length()不传参数,默认为整行的长度
- 获取指定字符在字符串中的位置: awk '{print index("$0","AA")}'
- 按指定字符分隔字符串:echo "1wa:2wa:3wa"|awk '{split($0,huluwa,":"); for(i in huluwa){print i,huluwa[i]}}'
- 对数组排序:awk -v
其他用法
- 三目运算符:awk 'aa=$1<100?true:false; print aa'
- 打印奇偶行: 奇数行 awk 'i=!i'; 偶数行 awk '!(i=!i)'
引用:http://www.zsythink.net/archives/tag/awk/page/2/
网友评论