一、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函数所匹配的字符串的长度。
一、awk实际用例
[root@localhost ~]# cat text
#名称,电话,过去三个月捐款数
ke Harrington:[510] 548-1278 250:100 :175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100 :175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100 :175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100 :175
Chet Main:[510] 548-5258:50:95:135
1.显示所有捐款人名称和第一个月捐款数
[root@localhost ~]# awk -F":" ‘{print $1,$3}’ text
ke Harrington 250
Christian Dobbins 155
Susan Dalsass 250
Archie McNichol 250
Jody Savage 15
…
2.显示Dan的电话号码
[root@localhost ~]# awk -F":" ‘/^Dan/{print $2}’ text
[406] 298-7744
3.显示Susan的名字和电话号码
[root@localhost ~]# awk -F: ‘/^Susan/{print $1 ,$2}’ text
Susan Dalsass [206] 654-6279
4.显示所有以D开头的姓(名在前,姓在后)
[root@localhost ~]# awk -F: ‘{print $1}’ text|awk ‘{print $2}’ | awk ‘/^D/’
Dobbins
Dalsass
5.显示所有以一个C或D开头的名
[root@localhost ~]# awk -F: ‘{print $1}’ text | awk ‘{print $1}’ | awk ‘/^ [ CD]/’
Christian
Dan
Chet
6.显示所有区号为916的人名
[root@localhost ~]# awk -F: ‘/916/{print $1}’ text
Guy Quigley
John Goldenrod
7.显示Ke的捐款.显示每个值时都有以$开头.如$250$100$175
[root@localhost ~]# awk -F: ‘/^ke/{print " $ “$3” $ “$4” $"$5}’ text
$250$100$175
8.显示姓,其后跟一个逗号和名
[root@localhost ~]# awk -F: ‘{print $1}’ text | awk ‘{print $2,",",$1}’
Harrington , ke
Dobbins , Christian
Dalsass , Susan
McNichol , Archie
Savage , Jody
Quigley , Guy
Savage , Dan