shell中awk语言
awk是一种很棒的语言,它适合处理文本处理和报表生成,其借鉴了一些其他语言的精华,比如c语言。在linux系统的日常处理工作中,发挥着重要的作用。
它允许你创建简短的程序,这些程序读取文件,为数据排序,处理数据,对输入执行计算以及生成的报表,还有无数其他的功能
awk编程模型
注意的是:awk由第二阶段的主输入循环维持,主输入循环反复执行,直到终止条件被触发。主输入循环自动依次读取输入文件行,以供处理,而处理的动作由程序员添加。awk已经搭建好了主输入循环的框架,我们的代码直接被嵌入到主输入循环中执行。与C语言不同,这里不用写main函数框架,我们的代码直接就是main函数中的语句。
awk调用方法
awk调用方法有三种:
1.shell 命令行调用: awk [-F 域分割符] 'awk程序段’输入文件
2.将awk命令插入相应脚本文件,然后awk命令调用:
awk -f awk脚本文件 输入文件 (-f表示调用awk脚本文件)
3.将awk命令插入相应脚本文件,设置脚本文件可执行,然后直接执行该脚本文件:
./awk脚本文件 输入文件
awk 脚本文件以sha-bang(#!)符号开头,其后加上awk路径(如/usr/bin/awk)。
法一
法二
此脚本文件无需以.awk命名
法三:
awk模式匹配
任何awk都由模式(pattern)和动作(action)组成。
模式:测试输入行是否需要执行动作的规则,决定动作何时触发。
动作:执行对输入行的处理
awk 的模式匹配经常用到正在表达式,下文先对正则表达式做简要介绍。
正则表达式的目的在于完成数据过滤,留下匹配的数据,去除不匹配的数据。
正则表达式是由一串字符和元字符构成的字符串,简称RE(RegularExpression)。
正则表达式的基本元素包括普通字符和元字符:普通字符,没有隐含意义,字面理解;元字符,shell赋予了他们超越字面的意义。下面是基本正则表达式中元字符集合及其意义(POSIX标准将正则表达式分做基本正则表达式和扩展正则表达式,大部分应用使用基本正则表达式)
基本正则表达式元字符集合及其意义:
正则表达式
1.hel*o 可匹配字符 helo hello helllo
2.hel.o 可匹配字符 helxo hel9o hel o ( . 可以匹配一个空格 )
3.^hello匹配以hello开头的行
4.hello$ 匹配以hello结尾的行,$放在匹配符号之后,用法和功能与^相反。
5.^$又匹配行首,又匹配行尾,中间没有字符,表示空行
6.^.$匹配只有一个字符的空行
7.[123456]匹配其中任一个数字。
8.[1-6]匹配1-6其中任一个数字。
9.[a-z]匹配a-z其中任一个字母。
10.[a-zA-Z]匹配所以英文单词
11.. .不在表示任意一个字符,而只是一个普通字符。
12.<the> 精确匹配the这个单词,一点都不能差。
13.JP{3}L 匹配值为JPPPL
14.JP{3,}L P至少出现3次
15.[a-z]{5} 精确匹配5个小写字母,如hello,house
扩展正则表达式元字符集合及其意义
扩展正则表达式举例:
jo?b 匹配job或joob
de+x 匹配deex deeeeeeex,但不匹配dex
re(a|e|o)d匹配readreed reod
RE1|RE2|RE3 表示多个正则表达式的或关系
记录和域
awk认为输入文件是结构化的,awk将行定义为记录,行中的每一个字符串定义为域,域之间用空格,Tab或者其他符号进行分隔,分隔域的符号叫做分隔符
在awk中,通过操作符$来指定执行的域,$1表示第一个域,$0表示所有的域。
awk关系运算符及其意义
awk环境变量及其意义
变量名 意义
$n 当前记录的第n个域,域间由FS分割
$0 记录的所有域
ARGC 命令行参数的数量
ARGIND 命令行中当前文件的位置(以0开始标号)
ARGV 命令行参数的数组
CONVFMT 数字转换格式
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FILEDWIDTHS 字段宽度列表,以空格键分隔
FILENAME 当前文件名
FNR 浏览文件的记录数
FS 字段分隔符,默认是空格键
IGNORECASE 布尔变量,如果为真则进行忽略大小写的匹配
NF 当前记录中的域数量
NR 当前记录数
OFMT 数字的输出格式
OFS 输出域分隔符,默认是空格符
ORS 输出记录分隔符,默认是换行符
RLENGTH 由match函数所匹配的字符串长度
RS 记录分隔符,默认是空格键
RSTART 由match函数所匹配的字符串的第1个位置
SUBSEP 数组下标分隔符,默认值是\034
格式化输出
printf(格式控制符,参数)
printf修饰符:
printf("%-15s",$1) 输出字符串,左对齐,长度为15
printf(".3f",2009.1012) 浮点数长度控制在10位、小数点后保留3位
printf("%.3f",2009.1012)
printf格式符及其意义:
%c ASCII字符
%d 整型数
%e 浮点数,科学计数法
%f 浮点数
%o 八进制数
%s 字符串
%x 十六进制数