awk编程

知识点:awk基本用法
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脚本文件 输入文件   脚本文件的首行以#!/bin/awk –f开头
推荐使用第一种方法和第三种方法

awk记录(行)和域(字符串)
awk认为输入文件是结构化的,awk将每个输入文件定义为记录,行中的每个字符串定义为域之间用空格、Tab键或其他符号进行分割,分割域的符号就叫分隔符
awk编程
第一个为空格符   以后的为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 (条件表达式)
   动作1
[else
   动作2]

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)
          do something witharray[variable]
ARGC 是ARGV数组中元素的个数,与C语言一样,从ARGV[0]开始,到ARGV[ARGC-1]结束

ARGV[0]中存储的是awk,即执行该脚本的程序名
ARGV[1]到ARGV[ARGC-1]存储了脚本后跟的位置参数

ENVIRON变量存储了Linux操作系统的环境变量
脚本文件
BEGIN {ARGV[x]
    for(x=0;x<ARGC;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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值