**《上古神器-AWK中高级实例分享-中》**
本节目录:
匹配模式
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 |
三元条件表达式
三元表达式 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双/单引号
|
字符串分隔
案例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中读取一行 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中高级实例分享-下》**
*****建议牢固掌握上/中章后再进行下章的学习*****
******************************************************************************************* * 为最大限度不影响读者感官: * * http://fengzhilinux.blog.51cto.com/1343279/1320317另起栏目,也请大家多支持 * ******************************************************************************************* |
转载于:https://blog.51cto.com/fengzhilinux/1320567