awk学习(2)

来源:互联网 发布:mac优酷缓存视频在哪 编辑:程序博客网 时间:2024/05/16 10:37

test文件见文章awk学习(1)

 

六、awk运算符

运算符描述= += -= *= /= %= ^= **=赋值?:C条件表达式||逻辑或&&逻辑与~ ~!匹配正则表达式和不匹配正则表达式< <= > >= != ==关系运算符空格连接+ -加,减* / &乘,除与求余+ - !一元加,减和逻辑非^ ***求幂++ --增加或减少,作为前缀或后缀$字段引用in数组成员 (用在for(var in array)中)

 

七、记录和域

1.awk把每一行当作一个记录(默认为/n)

   相关的变量有NR,FNR,RS,ORS,$0

2.每一行由若干个域组成(默认为空格或制表符)

   相关的变量有NF,$n

 

八、awk变量及操作符

1.变量(数字、字符串、数组,自定义变量和内建变量)

赋值var=value

如:awk 'BEGIN{var="value"}END{print var}' test

或利用命令行赋值

如:awk 'END{print start,end}' start=6 end=7 test

 

数组

(1)下标为数字

awk 'END{arr[0]=1;arr[1]=2;for(i in arr){print arr[i]}}' test

(2)下标为字符串

awk 'END{arr["test1"]="a";arr["test2"]="b";for(i in arr){print i,arr[i]}}' test

(3)删除数组元素

awk 'END{arr["test1"]="a";arr["test2"]="b";for(i in arr){if(i=="test1")delete arr[i]}for(i in arr){print i,arr[i]}}' test

 

2.操作符(几个例子)

(1)比较操作符

awk -F, 'var=$2>3?"gt":"lt"{print var}' test

(2)匹配操作符

awk -F, '/^test/{print $0}' test

(3)范围操作符

范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。

awk -F, '/test/,/abc/{print $0}' test

输出为:

test,2
abc,3
test,4
b,5
c,1

 

九、awk控制结构

1.BEGIN和END块

BEGIN:这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。

END:它在整个输入文件处理完成后被执行。

 

2.顺序结构

awk -F, 'END{a=1;b=2;print a,b}' test

其中a=1  b=2  print a,b为顺序执行

 

3.选择结构

(1)if

awk -F, '{if($2>3){print $0}}' test

(2)if-else

awk -F, '{if($2>3){print $0}else{print "less then"}}' test

(3)if-elseif-else

awk -F, '{if($2<3){print $0}else if($2==3){print "equal"}else{print "less then"}}' test

(4)switch-case(不是所有awk都支持)

 

4.循环结构

(1)for

awk 'END{sum=0;for(i=1;i<=100;i++){sum+=i;}print sum;}' test

(2)while

awk 'END{sum=0;i=1;while(i<=100){sum+=i;i++;}print sum;}' test

(3)特殊的for

awk -F, '{array[$2]++}END{for(i in array){print i,array[i];}}' test

 

5.流程控制语句

(1)continue

awk 'END{sum=0;for(i=1;i<=100;i++){if(i%2==0){continue}sum+=i}print sum;}' test

(2)break

awk 'END{sum=0;for(i=1;i<=100;i++){if(i==11){break}sum+=i}print sum;}' test

(3)next

next语句从输入文件中读取下一行,然后从头开始执行awk脚本

awk '{if($1~/test/){next}print $0}' test

(4)exit

exit语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错。

awk '{if($1~/test/){exit}print $0}' test

 

十、awk函数

假设文件为test

Test,1
test,2,test
abc,3
test,4
b,5
c,1


(1)字符串函数

1)sub替换函数

sub (regular expression, substitution string)

sub (regular expression, substitution string, target string)

匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在输入第一次匹配的时候。

举例:

awk -F, '{sub(/test/,"TEST");print $0}' test

awk -F, '{sub(/test/,"TEST",$0);print $0}' test

输出:

Test,1
TEST,2,test
abc,3
TEST,4
b,5
c,1

 

2)gsub全局替换函数

gsub (regular expression, substitution string)

gsub (regular expression, substitution string, target string)

不只在第一次时匹配

举例:

awk -F, '{sub(/test/,"TEST");print $0}' test

awk -F, '{sub(/test/,"TEST",$0);print $0}' test

 

3)index
index(string, substring)
返回子字符串第一次被匹配的位置,偏移量从位置1开始,无匹配的返回0
举例:
awk -F, '{idx=index($1,"est");print idx}' test
结果:
2
2
0
2
0
0

 

4)length
length(string)
记录的字符数
举例:
awk -F, '{len=length($0);print len}' test
结果:
6
11
5
6
3
3

 

5)substr
substr( string, starting position )
substr( string, starting position, length of string )
返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串
举例:
awk 'END{str=substr("Hello World!",1,7);print str;}' test
结果;
Hello W

 

6)match
match( string, regular expression )
返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。
举例:
awk 'END{str=match("Hello World!",/or+/);print RSTART,RLENGTH;}' test
结果:
8 2

 

7)toupper,tolower
toupper( string )
tolower( string )
字符串大小间的转换
举例:
awk 'END{print toupper("test"),tolower("TEST");}' test
结果:
TEST test

 

8)split
split( string, array, field separator )
split( string, array )
可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。
举例:
awk 'END{str="1:2:3:4:5";split(str,arr,":");for(i in arr){print arr[i];}}' test
结果:
4
5
1
2
3

 

(2)时间函数

(1)systime
返回从1970年1月1日开始到当前时间的整秒数
awk 'END{print systime();}' test
同date "+%s"

(2)strftime
strftime( [format specification][,timestamp] )
格式化时间
awk 'END{t=systime();fmt="%Y-%m-%d %H:%M:%S";print strftime(fmt,t);}' test
格式例子见man date

 

(3)数学函数

awk 'END{print int(90.123);print rand();print exp(1)}' test
90
0.237788
2.71828

 

(4)自定义函数

function name ( parameter, parameter, parameter, ... ) {
                        statements
                        return expression                  # the return statement and expression are optional
        }

func文件:
function max(v1,v2) {
        var = v1 > v2 ? v1 : v2;
        return var;
}
END{a=1;b=2;print max(a,b);}

awk -f func test
结果:
2