awk命令格式
AWK的两个特殊字段:BEGIN和END
BEGIN:在未读取输入文件行之前执行。
END:在读取输入文件行完毕后执行。
awk [-F 域分割符] ‘awk程序段’ 输入文件
注意:要用单引号将awk程序段括起来。awk -f awk脚本文件 输入文件
./ awk脚本文件 输入文件
注意:第三种方式中,awk脚本文件仍以sha-bang(#!)开头,但是sha-bang的符号后面加上awk的路径。
第一种调用方式:
awk '/^$/{print "this is a blank line!"}' city
第二种调用方式:
awk -f scr.awk city
第三种调用方式:
./ser.awk city
awk模式匹配
模式可以是以下任意一种:
•正则表达式:使用通配符的扩展集
•关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试
•模式匹配表达式:用运算符~(匹配)和 !~(不匹配)
•BEGIN 语句块, pattern语句块, END语句块
awk '{print $2,$1,$4,$3}' sure
//按照2,1,4,3的顺序打印sure的域
awk '{print $0}' sure
//打印sure的全部域
awk 'BEGIN{one=1;two=2}{print $(one+two)}' sure
//打印sure的第三个域
awk 'BEGIN{F}{FS=","}{print $1,$3}' sure
//以逗号为分隔符,打印1和3号域
awk 'BEGIN{F}{FS=","}{print $0}' sure
//以逗号为分隔符,打印所有域
awk关系和布尔运算符
•算术运算:(+,-,*,/,%(模),^,++x,x++)
•赋值运算:(=)
•布尔运算符: (||, &&,!)
•关系运算符:(<, <=, >,>=,!=, ==)
•正则运算符:(~,~!)(匹配正则表达式,与不匹配正则表达式)
awk 'BEGIN {FS=":"} $1~/root/' /etc/passwd
//打印/etc/passwd文件中第一个域匹配root关键字的记录
awk 'BEGIN {FS=":"} $0~/root/' /etc/passwd
//打印/etc/passwd文件中全部域匹配root关键字的记录
awk 'BEGIN {FS=":"} $0!~/nologic/' /etc/passwd
//打印/etc/passwd文件中全部域不匹配nologic关键字的记录
awk 'BEGIN {FS=":"} {if($3<$4) print $0' /etc/passwd
//打印第三域小于第四域的记录
awk 'BEGIN {FS=":"} {if($3==10||$4==10) print $0'/etc/passwd
//打印第三域等于10或第四域等于10的记录(精确匹配)
awk 'BEGIN {FS=":"} {if($3~10||$4~10) print $0' /etc/passwd
//打印第三域等于10或第四域等于10的记录(模糊匹配)
系统变量
•$n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。域 间由FS分割。
•$0 : 记录的所有域。
•ARGC : 命令行参数的数量。
•ARGIND : 命令行中当前文件的位置(从0开始算)。
•ARGV : 包含命令行参数的数组。
•CONVFMT : 数字转换格式(默认值为%.6g)。
•ENVIRON : 环境变量关联数组。
•ERRNO : 最后一个系统错误的描述。
•FIELDWIDTHS : 字段宽度列表(用空格键分隔)。
•FILENAME : 当前输入文件的名。
•NR : 表示记录数,在执行过程中对应于当前的行号(当前记录数)。
•FNR : 浏览文件的记录数。
•FS : 字段分隔符(默认是空格键)。
•IGNORECASE :布尔变量, 如果为真,则进行忽略大小写的匹配。
•NF : 当前记录中的域数量。
•OFMT : 数字的输出格式(默认值是%.6g)。
•OFS : 输出域分隔符(默认值是一个空格)。
•ORS : 输出记录分隔符(默认值是一个换行符)。
•RS : 记录分隔符(默认是一个换行符)。
•RSTART : 由match函数所匹配的字符串的第一个位置。
•RLENGTH : 由match函数所匹配的字符串的长度。
•SUBSEP : 数组下标分隔符(默认值是\034)。
awk 'BEGIN{FS=","} {print NF,NR,$0} END {print FILENAME}' city
格式化输出
printf (格式控制符,参数)
printf语句包含两部分:第一部分是格式控制符都以%符号开始,用以描述格式规范。第二部分是参数列表,与格式控制符相对应,是输出的对象。
printf修饰符:
• - : 左对齐。
• width : 域的步长。
• .prec : 小数点右边的位数。
printf格式符:
•%c:ASCII字符
•%d:整数型
•%e:浮点型
•%f:浮点型
•%o:八进制数
•%x:十六进制数
•%s:字符串
awk 'BEGIN{FS=","} {printf ("%s\t%d\n",$2,$8)}' city
解释:$2号域与%s对应,为字符串;$8号域与%d对应,为整数值,两个域之间用
Tab键隔开(\t),每输出两个域换行(\n).
awk 'BEGIN{printf("%c\n",65)}' //转换为ASCII字符
awk 'BEGIN{printf("%f\n",2008)}' //2008.000000
awk ‘BEGIN{FS=”,”} {printf (“%-15s\t%s\n”,$1,$3)}’ city
注:-15表示该字符串长度控制为15位,并且左对齐,若字符串不足15位,则用空
格补全。
awk ‘BEGIN{printf(“%10.3f\n”,2008)}’ // 2008.000
awk ‘BEGIN{printf(“%.3f\n”,2008.1314)}’ //2008.131
awk 'BEGIN{FS=","} {printf ("%-15s\t%s\n",$1,$3)}' city
注:-15表示该字符串长度控制为15位,并且左对齐,若字符串不足15位,
则用空格补全。
awk 'BEGIN{printf("%10.3f\n",2008)}' // 2008.000
awk 'BEGIN{printf("%.3f\n",2008.1314)}' //2008.131
内置字符串函数
•gsub(r,s):在输入文件中用s替换r.
•gsub(r,s,t):在t中用s替换r.
•index(s,t):返回s字符串中第一个t的位置。
•length(s):返回s字符串的长度。
•match(s,t):返回s是否包含匹配t的字符串。
•split(r,s,t):在t上将r分成序列s.
•sub(r,s,t):将t中第一次出现的r替换为s.
•substr(r,s):返回字符串r中从s开始的后缀部分。
•substr(r,s,t):返回字符串r中从s开始长度为t的后缀部分.
awk 'BEGIN{FS=":";OFS=":"} gsub(/root/,"gridsphere",$1) {print$0}' /etc/passwd
//将/etc/passed文件的第1域上的root字符串替换为gridsphere
awk 'BEGIN{FS=":";OFS=":"} gsub(/root/,"gridsphere",$0) {print$0}' /etc/passwd
//将/etc/passed文件的全部域上的root字符串替换为gridsphere
awk 'BEGIN {print index("gridsphere",er)}' //8
awk 'BEGIN {print length("gridphere")}' //9 默认匹配区分大小
awk 'BEGIN {IGNORECASE=1;print match("gridphere",/D/)}'
//4 IGNORECASE=1表示不分大小写匹配
awk 'BEGIN{str="multiprocessor programming";sub(/pro/,"PRO",str);printf("%s\n",str)}'
//multiPROcessor programming
awk 'BEGIN{str="multiprocessor programming";print substr(str,6)}'
//processor programming 返回str从第6个字符开始的后缀部分
awk 'BEGIN{str="multiprocessor programming";print substr(str,6,9)}'
//processor 返回str从第6个字符开始长度为9的后缀部分
条件语句和循环语句
条件语句 if语句:
if (条件表达式) 动作1 else 动作2
循环语句有三种:while,do while和for
for循环:
for(变量 in 数组)
{语句}
for(变量;条件;表达式)
{语句}
while循环:
while(表达式)
{语句}
do…while循环:
do
{语句} while(条件)
数组
基本格式:array[index]=value