知识点:awk基本用法
awk记录和域
awk关系、布尔运算符、表达式
awk系统变量
awk格式化输出
awk内置字符串函数
awk条件语句和循环语句
awk数组
awk基本用法:
调用awk有三种方法(与sed类似):
1)在Shell命令行输入命令调用awk:awk [-F 域分隔符]‘awk程序段’ 输入文件
2)将awk程序段插入脚本文件后,然后通过awk命令调用它:awk -fawk脚本文件 输入文件 【脚本文件的首行不以#!/bin/awk –f开头】
3)将awk命令插入脚本文件后,设置该脚本文件为可执行,然后直接执行该脚本文件,格式为:
推荐使用第一种方法和第三种方法
awk记录(行)和域(字符串)
:
awk认为输入文件是结构化的,awk将每个输入文件行定义为记录,行中的每个字符串定义为域,域之间用空格、Tab键或其他符号进行分割,分割域的符号就叫分隔符
第一个为空格符
以后的为Tab键,默认的
awk改变域分隔符有两种方法:
awk 'BEGIN {FS=","} {print $1,$3}' sturecord2
awk关系、布尔运算符、表达式:
运算符 意义
< 小于
> 大于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
~匹配正则表达式
!~不匹配正则表达式
运算符 意义
|| 逻辑或
&&逻辑与
! 逻辑非
与其他编程语言一样,awk表达式用于存储、操作和获取数据,一个awk表达式可由数值、字符常量、变量、操作符、函数和正则表达式自由组合而成
变量是一个值的标识符,定义awk变量非常方便,只需定义一个变量名并将值赋给它即可。变量名只能包含字母、数字和下划线,而且不能以数字开头
运算符 意义
+ 加
- 减
* 乘
/ 除
% 模
^或** 乘方
++x 在返回x值之前,x变量加1
x++ 在返回x值之后,x变量加1
awk 'BEGIN {FS=":"} $1~/root/'/etc/passwd
awk 'BEGIN {FS=":"} {if($3==10||$4==10) print $0}'/etc/passwd
awk 'BEGIN {FS=":"} {if($3~10||$4~10) print$0}' /etc/passwd 正则表达式~表示包含
==是为数字匹配,~正则表达式为匹配字符串
awk执行文件:
#!/bin/awk -f
BEGIN {FS=","}
{ total=$4+$5+$6+$7+$8
avg=total/5
print $1,avg
}
awk系统变量:
awk定义了很多内建变量用于设置环境信息,我们称它们为系统变量,这些系统变量可分为两种:
第1种用于改变awk的缺省值,如域分隔符;
第2种用于定义系统值,在处理文本时可以读取这些系统值,如记录中的域数量、当前记录数、当前文件名等,awk动态改变第2种系统变量的值
变量名
意义
$n 当前记录的第n个域,域间由FS分割
$0 记录的所有域
ARGC 命令行参数的数量
ARGIND 命令行中当前文件的位置(以0开始标号)
ARGV 命令行参数的数组
CONVFMT 数字转换格式
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表,以空格键分割
FILENAME 当前文件名
FNR 浏览文件的记录数
file number row
FS 字段分隔符,默认是空格键 Field
Sign
IGNORECASE 布尔变量,如果为真,则进行忽略大小写的匹配
NF 当前记录中的域数量
NR 当前记录数
OFMT 数字的输出格式
OFS 输出域分隔符,默认是空格键
ORS 输出记录分隔符,默认是换行符
RLENGTH 由match函数所匹配的字符串长度
RS 记录分隔符,默认是空格键
RSTART 由match函数所匹配的字符串的第1个位置
SUBSEP 数组下标分隔符,默认值是\034
awk格式化输出:
awk的一大主要功能是产生报表,报表就要求按照预定的格式输出,awk借鉴C语言的语法,定义了printf输出语句,它可以规定输出的格式。
printf:printf(格式控制符,参数)
格式控制符:awk修饰符,格式符
修饰符 意义
- 左对齐
width 域的步长
.prec 小数点右边的位数
运算符 意义
%c ASCII字符
%d 整型数
%e 浮点数,科学记数法
%f 浮点数
%o 八进制数
%s 字符串
%x 十六进制数
awk 'BEGIN {FS=","; print "NAME\t\tPHCHNUMBER"}{printf("%-15s\t%s\n",$1,$3)}' sturecord2
结果为:
NAME
PHCHNUMBER
Li Hao
80283058
Zhang Ju
2343255
Wang Bin
2342353
Zhu Lin
234342
awk内置字符串函数
awk内置字符串函数极为强大,是Shell处理字符串的常用工具
函数名
意义
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中第1次出现的r替换为s
substr(r,s) 返回字符串r中从s开始的后缀部分
substr(r,s,t) 返回字符串r中从s开始长度为t的后缀部分
eg:
awk 'BEGIN {print index("gridephere","ph")}'
awk 'BEGIN {str="multiprocesser programming";printsubstr(str,6,11)}'
awk条件语句和循环语句
awk条件语句和循环语句与C语言的语法完全一样
if (条件表达式)
[else
while (条件表达式)
do
while (条件表达式)
for(设置计数器初值;测试计数器;计数器变化)
awk数组:关联索引(索引可以为字符串or数字)
数组是用于存储一系列值的变量,这些值之间通常是有联系的,可通过索引来访问数组的值,索引需要用中括号括起,数组的基本格式为:
array[index]=value
关联数组是指数组的索引可以是字符串,也可以是数字
关联数组在索引和数组元素值之间建立起关联,对每一个数组元素,
awk
自动维护了一对值:索引和数组元素值
关联数组的值无需以连续的地址进行存储
,awk的所有数组都是关联数组
字符串和数字之间的差别是明显的,如,我们使用array[09]指定一个数组值,如果换成array[9]就不能指定到与array[09]相同的值
split(r,s,t)
函数将字符串以t为分隔符,将r字符串拆分为字符串数组,并存放在s中,此时s通常就是一个数组
例4-62
awk 'BEGIN {printsplit("abc/def/xyz",str,"/")}'
上面命令以“/”为分隔符,将字符串abc/def/xyz分开,并存在str数组中,split函数的返回值是数组的大小
awk可使用for循环打印数组内容
for (variable in array)
ARGC
是ARGV数组中元素的个数,与C语言一样,从ARGV[0]开始,到ARGV[ARGC-1]结束
ARGV[0]中存储的是awk,即执行该脚本的程序名
ARGV[1]到ARGV[ARGC-1]存储了脚本后跟的位置参数
ENVIRON变量存储了Linux操作系统的环境变量
脚本文件:
BEGIN {ARGV[x]
print
ARGV[x]
print
ARGC
}
[root@localhost A]# awk -f argv.awk xyz n=99 "HelloWorld"
awk
xyz
n=99
Hello World
4
http://blog.sina.com.cn/s/blog_6bd7d94301014zbq.html
http://blog.sina.com.cn/s/blog_6bd7d94301014zbq.html