**《上古神器-AWK中高级实例分享-中》**


本节目录:



匹配模式... 15

三元条件表达式... 15

四种书写模式... 16

建议用单引号... 16

函数... 17

数组... 19


匹配模式

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 )


213821328.png

四种书写模式


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转义带来的干扰

推荐单引号

213508824.png

字符串分隔

案例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)

}'

结果:

clip_image004

案例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,"..."

}'

结果:

clip_image005

案例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

}'

clip_image006

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


213542355.png

213544364.png


字符串函数tolower /toupper

213755479.png

函数

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 < "-"

print

}

}

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()

213718380.png

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]}

}'}'

clip_image015

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]}

}'

clip_image016

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

clip_image017

d> 系统变量的数组

读取标准输入参数:

ARGV 元素个数ARGC,第一个元素下标是0,最后一个是ARGC-1

ENVIRON

BEGIN{

for (env in ENVIRON)

print env"="ENVIRON[env]

}

e> 删除数组


Delete acro[acronym]


下节预告:

**《上古神器-AWK中高级实例分享-下》**

*****建议牢固掌握上/中章后再进行下章的学习*****


实战需求: 22



*******************************************************************************************

* 为最大限度不影响读者感官: *

* http://fengzhilinux.blog.51cto.com/1343279/1320317另起栏目,也请大家多支持 *

*******************************************************************************************