awk中字符串处理函数

字符串处理的时候,有求字符串长度,截取子串,替换子串的操作,大小写转换的操作。字符串的打印操作。

子串处理函数
index(s,t) 返回字符串t(子串)在字符串s(父串)中出现在最左边的位置,如果子串在父串中不存在,那么返回0。字符串中字符的位置是从1开始的。注意:字符串一定要用双引号括起来而不是单引号。

[root@centos7 ~]# awk 'BEGIN{print index("abc","b")}'
2
[root@centos7 ~]# awk 'BEGIN{print index("abc","s")}'
0
[root@centos7 ~]# 

substr(s,p) 在字符串s中返回从位置p到结尾的子串(包括p位置上的字符)。
substr(s,p,n) 在字符串s中返回从位置p开始(包括p位置的字符)往结尾方向,总共n个字符的子串。

[root@centos7 ~]# awk 'BEGIN{print substr("abcdefgh",index("abcdefgh","f"))}'
fgh
[root@centos7 ~]# 
[root@centos7 ~]# awk 'BEGIN{print substr("abcdefgh",index("abcdefgh","f"),2)}'
fg
[root@centos7 ~]# 

举例:将/etc/passwd中的第1个字段第1个字母修改成大写,其他都不变输出。

[root@centos7 awk]# cat rule
BEGIN{
lower="abcdefghijklmnopqrstuvwxyz"
upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
FS=":"
}
{
#先确定第1个字段中的第1个字符是什么
firstchar=substr($1,1,1)
#由于lower和upper两个变量是对应关系,因此确定出小写字母中位置,那么在upper中取出这个字符然后跟$1字段剩余的拼接就形成了新的$1,然后打印整个字符串$0
#字符串的拼接就两个写在一起
if (pos=index(lower,firstchar)) $1=substr(upper,pos,1)substr($1,2)
print $0
}
[root@centos7 awk]# 
[root@centos7 awk]# awk -f rule /etc/passwd
Root x 0 0 root /root /bin/bash
Bin x 1 1 bin /bin /sbin/nologin
Daemon x 2 2 daemon /sbin /sbin/nologin
Adm x 3 4 adm /var/adm /sbin/nologin

字符串长度
length(s)获取字符串的长度,length()获取$0的长度

[root@centos7 ~]# awk -F: '{print length($1)}' /etc/passwd
4

替换函数
sub(r,s,t) 在字符串t中用s替换正则表达式r匹配到的第一个字符串。如果替换成功返回1,否则返回0。如果没有指定t,那么默认就是用$0.
gsub(r,s,t) 在字符串t中用s替换正则表达式r匹配到的所有字符串。如果替换成功返回n,n代表替换了几处,否则返回0。如果没有指定t,那么默认就是用$0.
正则表达式r需要用/…/括起来,也可以用变量来表示,用变量表示时候,不需要括起来。
在gsub或者sub中的替换字符串里出现&的时候,就是代表正则表达式匹配到的字符。那么替换字符串就可以结合正则表达式匹配的字符串了。
替换函数就是直接替换字符串。

[root@centos7 ~]# awk 'BEGIN{str="abcdabcdabcd";print sub(/a/,"A",str);print str}'
1
Abcdabcdabcd
[root@centos7 ~]# 

#正则表达式var="a"在变量中必须用""括起来。
[root@centos7 ~]# awk 'BEGIN{str="abcdabcdabcd";var="a";print gsub(var,"A",str);print str}'
3
AbcdAbcdAbcd
[root@centos7 ~]# 
[root@centos7 ~]# awk 'BEGIN{str="abcdabcdabcd";print gsub(/a/,"A",str);print str}'
3
AbcdAbcdAbcd
[root@centos7 ~]# 

[root@centos7 ~]# awk 'NR==1{sub(/root/,"ROOT");print $0}' /etc/passwd
ROOT:x:0:0:root:/root:/bin/bash
[root@centos7 ~]# awk 'NR==1{gsub(/root/,"ROOT");print $0}' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
[root@centos7 ~]# 

在gsub或者sub中的替换字符串里出现&的时候,就是代表正则表达式匹配到的字符。
如果只是单纯打印字符“&”,那么需要转义,转义用\来进行

[root@centos7 ~]# awk 'BEGIN{str="abc";print sub(/a/,"&->A",str);print str}'
1
a->Abc
[root@centos7 ~]# 
[root@centos7 ~]# awk 'BEGIN{str="abc";print sub(/a/,"\\&->A",str);print str}'
1
&->Abc
[root@centos7 ~]# 
[root@centos7 ~]# awk 'BEGIN{print "\\"}'
\
[root@centos7 ~]# 

大小写转换函数
tolower(s) 将字符串s中所有字符转换成小写字符
toupper(s)将字符串s中所有字符转换成大写字符

[root@centos7 ~]# awk 'BEGIN{print toupper("aA")}'
AA
[root@centos7 ~]# awk 'BEGIN{print tolower("aA")}'
aa
[root@centos7 ~]# 

子串匹配函数match
match(s,r) 该函数用于确定正则表达式r是否和指定字符串s匹配,如果匹配上,那么返回正则表达式中第1个字符匹配的位置。这个函数可以作为条件判断。在系统变量中,RSTART用于存放第1个匹配到的字符的位置,RLENGTH变量存放匹配到的字符长度。

#这个正则是匹配大写字符,第一个大写字符U在字符串中的第5个位置,因此返回5
[root@centos7 ~]# awk 'BEGIN{print match("the UNIX operating system",/[A-Z]+/)}'
5
[root@centos7 ~]# 
#这里的5代表从第5个字符开始,4代表正则表达式匹配到4个字符,即UNIX
[root@centos7 ~]# awk 'BEGIN{print match("the UNIX operating system",/[A-Z]+/);print RSTART,RLENGTH}'
5
5 4
[root@centos7 ~]# 

index(s,t)和match(s,r)的区别
index中子串无法用正则表达式,而match中可以使用。

[root@centos7 ~]# awk 'BEGIN{print index("the UNIX operating system","UNIX")}'
5
[root@centos7 ~]# awk 'BEGIN{print index("the UNIX operating system",/[A-Z]+/)}'
0
[root@centos7 ~]# awk 'BEGIN{print match("the UNIX operating system",/[A-Z]+/);print RSTART,RLENGTH}'
5
5 4
[root@centos7 ~]# 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值