**《上古神器-AWK中高级实例分享-中》**
本节目录:
匹配模式... 15
等于==. 15
模糊匹配~. 15
大于... 15
逻辑匹配 &&.. 15
空行匹配... 15
三元条件表达式... 15
四种书写模式... 16
建议用单引号... 16
函数... 17
Getline函数... 17
Close()函数... 18
System() 函数... 18
Nextfile. 18
时间函数Strftime() systime() 18
自定义函数... 19
数组... 19
一维数组元素提取及排序... 19
二维数组元素提取(split) 21
系统变量的数组... 21
删除数组 22
匹配模式
I. 等于==
awk '$1=="sun" {print $0}' file
II. 模糊匹配~
awk '$1 ~ /sun/ {print $0}' file
III. 大于
awk '$2>40' file
IV. 逻辑匹配 &&
awk 'length($1)>4 && $2>50' file
V. 空行匹配
awk '/^$/{x++}END{print x}' file
三元条件表达式
Expr 1? Expr 2: expr 3
三元表达式 awk '{print ($1<$2) ? "true" : "false"}'
if (site in dosome || doall )
四种书写模式
I,II 两种方式重点掌握
I> awk '{print}' file
II> cat b.sh
#!/bin/bash
awk '{print $0}' file
III> awk -f b.awk file
cat b.awk: {print}
IV> #!/bin/gawk -f
BEGIN{filename==ARGV[1]}
{print}filename #或者 ARGV[1]
AWK双/单引号
There are single quotes around
the awk program so that the shell won’t interpret any of it as special shell characters
避免shell转义带来的干扰
推荐单引号
字符串分隔
案例1<index函数>
#index 简介è Index(s,t) 返回子串t在字符串s中的位置,如果没有指定s,返回0
###案例1<index函数>:
awk '
BEGIN{
##定义变量x
x="abc def";
##awk中变量直接引用,无需$引用
part=index(x,"b");
##打印从b位置开始后的4个字符-包括b位置
print substr(x,part,4)
}'
结果:
案例2<substr函数>
#substr简介èSubstr(s,p,n) 返回字符串s中从位置p开始长度为n的子串.如果没有给出n,返回从p开始剩余的字符串
###案例2<substr函数>:
awk '
BEGIN{
##定义变量x
x="1234567";
##打印从第二个字符开始所有字符
part1=substr(x,2);
print part1,"..."
}'
awk '
BEGIN{
x="1234567";
##打印从第二个字符开始,后3个字符
part1=substr(x,2,3);
print part1,"..."
}'
结果:
案例3<match函数>
##match(s,r) 测试s是否包含匹配r的字符串
##match中两个系统函数 RESTART和RLENGTH.RSTART 当模式不匹配的时,RSTART为0,而##RLENGTH为-1,当匹配时,RSTART为匹配字符串的位置,RLENGTH为匹配字符串的长度,如上##例子RSTART为5,RLENGTH为4 所以RSTART+RLENGTH为匹配字符串后的第一个字符##串的位置
###案例3<match函数>:
awk '
BEGIN{
##匹配字数,
match("this is a 1234 test",/[0-9]+/);
#RSTART,RLENGTH为内置变量
#RSTART 为匹配到字符串所有的位置
#RLENGTH 为匹配字符串的长度
print RSTART,RLENGTH
}'
sub/gsub区别及用法
替换函数:
Sub(); 只替换一个位置
gsub() 替换所有 g为global意思
Sub(r,s,t) 在字符串t中用s替换正则表达式r的首次匹配,t默认为$0
Gsub(r,s,t) 在字符串t中用字符串s替换和正则表达式r匹配的所有字符串,返回替换的个数,如果没有给出t,默认$0
awk '{gsub(/ /,"\n")}END{ print $0}' abc
awk '{sub(/ /,"|||");print $0}' ../test_tem/c
字符串函数tolower /toupper
函数
a>Getline函数
从输入中读取另一行.getline函数不仅能读取正常的输入数据流,而且也能处理来自文件和管道的输入
Getline函数类似awk中的next语句,两者都是导致下一个输入行被读取,next语句将控制传递回脚本的顶部,getline函数得到下一行但没有改变脚本的控制。可能 的返回值如下:
1 如果能够读取一行。
0 如果到了文件末尾
-1 如果遇到错误
注意: getline函数被称为一个函数并且返回了一个值,但他的语法类似于一个语句,不能写成getline(),它的语法不请允许有圆括号。
从文件读取
Getline < “data” ###从文件data中读取一行
BEGIN{
while (1 < 2){
printf "Enter your Name: "
getline < "-"
}
}
Getline获取的值赋值为变量
BEGIN{
printf "Enter your name:"
getline name < "-"
print name
}
Wrong: Name=getline
从管道中读取输入
“who am i”|getline
“date +’%a.,%h%d,%y’”
b> Close()函数
Close() 函数用于关闭打开的文件和管道,
1. 每次只能打开一定数量的管道(后面“约束”的章节有介绍为什么会有约束),close()函数关闭一个使用过的管道(通常是getline返回0或者-1的时候)
例: close(“who”)
c> System() 函数
System() 函数执行一个表达式给出的命令,它的返回为命令的退出状态.脚本等待这个命令完成任务后才继续执行.
例:
BEGIN{
If(system(“mkdir dale”) != 0)
Print “Command Failed”
}
Awk –v comfile=”cup_commands” script - ##-v 可使BEGIN中的参数生效
d> Nextfile
和next语句类似 执行到nextfile时,当前的数据文件被放弃.操作从脚本的顶端开始,并使用下一个文件的第一个记录
e> 时间函数Strftime() systime()
f> 自定义函数
Function name(parameter-list) {
}
Parameter-list是逗号分隔变量列表,函数体由一个或者多个语句组成.函数中通常包含一个return语句,用于将控制返回到脚本中调用该函数的位置;它通常用一个表达式来返回一个值,如下所示:
Return expression
实例:
Function insert(STRING,POS,INS){
Before_tmp=substr(STRING,1,POS)
After_tmp=substr(STRING,POS+1)
Return before_tmp INS after_tmp
}
数组
a> 数组简介
array[index-expression]
index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。
要遍历数组中的每一个元素,需要使用如下的特殊结构:
for (var in array) { statement1, ... }
其中,var用于引用数组下标,而不是元素值;
b> 一维数组元素提取及排序
seq 10| awk '
{
##定义数据a,行号为索引
a[NR]=$0
}END{
##数据元素提取
for(i in a)
{print i,a[i]}
}'}'
seq 10| awk '
{
a[NR]=$0
}END{
##awk下用asort排序,排序的实质是对key求值
b=asort(a);
for(i=1;i<=b;i++)
##打印key,value
{print i,a[i]}
}'
c> 二维数组元素提取(split)
SUBSEP 多维数组分割符
awk '
BEGIN{
##二维数组定义
ay[1,10]="a";
ay[10,2]="b";
}END{
for(k in ay)
##二维数组提取(split)
{split(k,idx,SUBSEP);
print idx[1],idx[2],ay[idx[1],idx[2]];}
}' /dev/null
d> 系统变量的数组
读取标准输入参数:
ARGV 元素个数ARGC,第一个元素下标是0,最后一个是ARGC-1
ENVIRON
BEGIN{
for (env in ENVIRON)
print env"="ENVIRON[env]
}
e> 删除数组
Delete acro[acronym]
下节预告:
**《上古神器-AWK中高级实例分享-下》**
*****建议牢固掌握上/中章后再进行下章的学习*****
实战需求: 22
求1-100和... 22
打印第一列相同第二列最大值... 22
打印第一列相同值出现次数... 24
两列求最大值... 24
多列求最大值... 25
除第一列外所有值求和... 25
相同列求和... 26
相同字段求最大值最小值,相同字段出现的次数... 27
FNR,NR巧用/不同字段对应列替换... 28
案例分析... 30
apache-log日志分析... 31
知阵转换... 33
行列对调案例分析... 34
相同字段的其它内容放相同行... 35
相同字段的其它内容放相同行且补充字段... 35
Split分割字符串实例... 36
格式化输出... 38
FR,NFR双关联 注册账户统计... 40
统计系统netstat 状态及各状态连接数... 41
*******************************************************************************************
* 为最大限度不影响读者感官: *
* http://fengzhilinux.blog.51cto.com/1343279/1320317另起栏目,也请大家多支持 *
*******************************************************************************************