shell编程——文本处理利器awk命令(二)

1    算术运算符

与其他程序语言基本相同,支持浮点数计算,x=5/2,print x直接输出计算结果

2    赋值运算符

= += -= *= /= %= ^=

3    条件运算符

expression?value1:value2

eg.

grade=($2>90?"A":"B")

print grade

4    逻辑运算符

&& || !

$2 > 80 && $3 > 80 && $4 > 80 && $5 >80 {

    print

}  //  输出所有的字段都大于80的记录

5    关系运算符

~    匹配运算符    $1~/^T/表示匹配第1个字段以字符T开头的记录

!~    不匹配运算符    $1!~/a/表示匹配第1个字段不含有字符a的记录

$1~/^K/ { print }  匹配第1个字段以字符K开头的记录

6    字符串函数

index(string1,string2)

定位string2在string1中出现的位置,如果出现多次,则返回第一次出现的位置。如果不包含string2,则返回0。区分大小写。

print index("Hello,world.","world")     //  7

length(string)

返回值为整数,表示字符串string的长度

match(string,regexp)

其功能是在字符串string中搜索匹配正则表达式的子串。用户可以用RSTART和RLENGTH来获取相关的返回值。RSTRAT表示子串在父串中出现的位置,匹配不成功返回0。RLENGTH表示匹配到子串的长度,匹配不成功返回-1。

spilt(string,array,seperator)

将一个字符串根据指定的分隔符拆分成一个数组。第一个参数为要拆分的字符串,第2个参数用来储存拆分结果的数组,第3个参数用来指定分隔符,分隔符可以用正则表达式来表示。

eg.

string="5P12p89"

spilt(string,arr,/[Pp]/)

print arr[1]

print arr[2]

print arr[3]

//  结果:5  12  89

作为分隔符的字符并不出现在拆分结果中

sub(regexp,replacement,string)和gsub(regexp,replacement,string)

替换字符串中的子串,前者替换第一次出现的,后者替换所有

如果sub与gsub函数的第二个参数为空串,则表示将符合匹配规则的字符串删除

substr(string,start,[length])

截取指定长度的子串。第3个参数可以忽略,表示从开始位置一直截取到父串的末尾

通过match()和substr()可以将父串中全部符合规则的子串提取出来。

eg.

BEGIN {

    pages="p12-p34 p56-p78"

    while(match(pages,/[0-9]+/)>0) {

    print substr(pages,RSTART,RLENGTH)  #截取并输出匹配的子串

    sub(/[0-9]+/,"",pages)  #删除匹配的子串

    }

}

7    算术函数

rand()    返回介于0与1之间的随机数

srand([x])    以x为种子返回一个随机数

8    数组的定义和赋值

awk并没有提供数组定义的语句,当用户为数组第1个元素赋值时,awk便会自动创建该数组。

awk数组的下标从1开始计算,数组的第1个元素的下标为1。也支持关联数组,所谓关联数组,是指以字符串为下标的数组。

在定义数组时,用户并不需要指定数组的数据类型,实际上awk可以存储任何简单类型的数据,例如字符串、整数以及浮点数类型的数据。

赋值:

array[n]=value

引用:

array[n]

eg.

BEGIN {

    arr[1]="tom"

    arr[2]="john"

    arr["a"]=12

    arr[3]=3.1415

    print arr[1],arr[2],arr["a"],arr[3]

}

9    遍历数组

数组的长度可以使用length()函数获得

当数组下标连续且是整数值作为下标,可以使用for循环进行遍历。如果下标是非连续的或者字符串,则不可以使用上述方法。

awk提供了一种更为便捷的机制来遍历数组元素:

for (n in array) {

    print array[n]

}

在这种方法中,数组元素的下标默认是无序的,所以导致通过以上语句得到的数组元素也是无序的。

另外在for循环中,所输出的下标是用户定义时使用的下标,并没有转换成整数。

要按顺序遍历数组,必须使用下标来引用数组元素。

eg.

BEGIN {

    arr[1]="tom"

    arr[2]="john"

    arr["a"]=12

    arr[3]=3.1415

    arr[4]=5

    arr[99]=23

    for(n in arr){

        print arr[n]

    }

}

// 结果:

5

12

23

tom

john

3.1415

print n:

4

a

99

1

2

3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值