awk:三剑客之一,常用来处理列。
awk是一门解释型的编程语言,在文本处理领域它是非常强大的,灵活性是awk最大的优势 。
AWK的典型用途
使用AWK可以做很多任务,下面是其中一些
- 文本处理
- 输出格式化的文本报表
- 执行算数运算
- 执行字符串操作等等
一、awk命令的使用
1.常用命令选项:
- -F 指定输入分隔符,可以是字符串或正则表达式,如-F:
- -v var=value 赋值一个用户定义变量,将外部变量传递给awk(每定义一个变量一个参数-v)
- -f scriptfile 从脚本文件中读取awk命令
- -v OFS=”\t” OFS变量表示输出分隔符(每定义一个变量一个参数-v)
2.模式和操作:
模式可以是以下任意一个:
awk脚本是由模式和操作来组成的
1.模式可以是以下任意一个
- /正则表达式/: 使用通配符的扩展集,在”/” “/”这两根斜线之间的是正则表达式
- 关系表达式: 使用运算符进行操作,可以是字符串或数字的比较测试
- 模式匹配表达式: 用运算符 ~(匹配)和 ~!(不匹配)
- BEGIN语句块、pattern语句块、END语句块
2.操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是 :
- 变量或数组赋值
- 输出命令
- 内置函数
- 控制流语句
3.基本结构:
awk ‘BEGIN{ print “start” } pattern{ commands } END{ print “end” }’ file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分 是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中。
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
4.内置变量:
- [A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
- $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
- $0 这个变量包含执行过程中当前行的文本内容。
- argc:命令行参数的数目。
- argind:命令行中当前文件的位置(从1开始算)。
- argv:包含命令行参数的数组。
- convfmt:数字转换格式(默认值为%.6g)。
- environ:环境变量关联数组。
- erron:后一个系统错误的描述。
- fieldwidthos:字段宽度列表(用空格键分隔)。
- filename:当前输入文件的名。
- FBR:同NR,但相对于当前文件。
- FS:字段分隔符(默认是任何空格)。
- ignorecase:如果为真,则进行忽略大小写的匹配。
- NF:表示字段数,在执行过程中对应于当前的字段数。
- NR:表示记录数,在执行过程中对应于当前的行号。
- ofmt:数字的输出格式(默认值是%.6g)。
- OFS:输出字段分隔符(默认值是一个空格)。
- ORS:输出记录分隔符(默认值是一个换行符)。
- RS:记录分隔符(默认是一个换行符)。
- rstart:由match函数所匹配的字符串的第一个位置。
- rlength:由match函数所匹配的字符串的长度。
- subsep:数组下标分隔符(默认值是34)
5.输出版本号
awk --version
二、awk测试
1.内置变量
awk '{ print $NF }' filename #打印出一行中的后一个字段;
$(NF-1) awk '{ print NF }' filename #总字段数,也可组合使用
awk '{ print $2,$3 }' filename #指定列
awk '{ printf("%s^%s\n",$2,$3) }' filename awk 'END{ print NR }' filename
awk 'END{ print NR }' filename #统计文件中的行数:下面命令只用了END语句块,在读入每一行的 时,awk会将NR更新为对应的行号,当到达后一行NR的值就是后一行的行号,所以END语句块中的NR就是文件 的行数
seq 100 | awk 'BEGIN{sum=0} {sum+=$1} END{print "总和:"sum}' #一个每一行中第一个字段值累加
注意awk变量不需要 " $ " 引用,大括号中的变量。
2.外部变量传递
VAR=10000
echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' #-v选项,可以将外部值(并非来自stdin) 传递给awk
var1="aaa"
var2="bbb"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 #变量之间用空格分隔作为awk的命令行参数跟随 在BEGIN、{}和END语句块之后
echo | awk '{print ENVIRON["PATH"]} ' #shell全局变量传递给awk
3.匹配运算
awk 'BEGIN {a="100testa"; if(a ~ /^100*/) {print "ok";}}'
4.其它运算符
#$ 字段引用
#空格 字符串连接符
#a>b?y:n 三目运算条件表达式
#in 数组中是否存在某键值
awk 'BEGIN{a="b";print a=="b"?"ok":"err";}'
awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}'
awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'
5.高级输入输出
vi filename
aa 100
bb 353
cc 234
total 1000
awk '{if($1=="total"){next};print }' filename #awk中next语句,相当于其他编程语言的continue
6.设置字段定界符
awk -F: '{ print $NF }' /etc/passwd
awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd
awk 'BEGIN{FS=":"; OFS="-->"} {print $1,$3}' /etc/passwd #在BEGIN语句块中则可以用OFS=“定界 符”设置输出字段的定界符
7-v 变量赋值选项
awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'Name = Jerry
8.打印文件所有内容
awk '{print}' filename
9. NF 字段数目
echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'