|
9.2.9 内置的字符串函数
a w k有许多强大的字符串函数,见表9 - 4。
表9-4 awk内置字符串函数
g s u b ( r, s ) 在整个$ 0中用s替代r
g s u b ( r, s , t ) 在整个t中用s替代r
i n d e x ( s , t ) 返回s中字符串t的第一位置
l e n g t h ( s ) 返回s长度
m a t c h ( s , r ) 测试s是否包含匹配r的字符串
s p l i t ( s , a , f s ) 在f s上将s分成序列a
s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p
s u b ( r, s ) 用$ 0中最左边最长的子串代替s
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
g s u b函数有点类似于s e d查找和替换。它允许替换一个字符串或字符为另一个字符串或字
符,并以正则表达式的形式执行。第一个函数作用于记录$ 0,第二个g s u b函数允许指定目标,
然而,如果未指定目标,缺省为$ 0。
i n d e x(s,t)函数返回目标字符串s中查询字符串t的首位置。l e n g t h函数返回字符串s字符
长度。m a t c h函数测试字符串s是否包含一个正则表达式r定义的匹配。s p l i t使用域分隔符f s将
字符串s划分为指定序列a。s p r i n t函数类似于p r i n t f函数(以后涉及),返回基本输出格式f m t的
结果字符串e x p。s u b(r,s)函数将用s替代$ 0中最左边最长的子串,该子串被( r)匹配。
s u b(s,p)返回字符串s在位置p后的后缀。s u b s t r(s,p,n)同上,并指定子串长度为n。
现在看一看a w k中这些字符串函数的功能。
1. gsub
要在整个记录中替换一个字符串为另一个,使用正则表达式格式, /目标模式/,替换模式
/。例如改变学生序号4 8 4 2到4 8 9 9:
2. index
查询字符串s中t出现的第一位置。必须用双引号将字符串括起来。例如返回目标字符串
B u n n y中n y出现的第一位置,即字符个数。
3. length
返回所需字符串长度,例如检验字符串J . Tr o l l返回名字及其长度,即人名构成的字符个
数。
还有一种方法,这里字符串加双引号。
78 第二部分文本过滤
下载
4. match
m a t c h测试目标字符串是否包含查找字符的一部分。可以对查找部分使用正则表达式,返
回值为成功出现的字符排列数。如果未找到,返回0,第一个例子在A N C D中查找d。因其不
存在,所以返回0。第二个例子在A N C D中查找D。因其存在,所以返回A N C D中D出现的首位
置字符数。第三个例子在学生J . L u l u中查找u。
5. split
使用s p l i t返回字符串数组元素个数。工作方式如下:如果有一字符串,包含一指定分隔
符- ,例如A D2 - K P 9 - J U 2 - L P - 1,将之划分成一个数组。使用s p l i t,指定分隔符及数组名。此
例中,命令格式为( " A D 2 - K P 9 - J U 2 - L P - 1 ",p a r t s _ a r r a y," - "),s p l i t然后返回数组下标数,这
里结果为4。
还有一个例子使用不同的分隔符。
这个例子中,s p l i t返回数组m y a r r a y的下标数。数组m y a r r a y取值如下:
本章结尾部分讲述数组概念。
6. sub
使用s u b发现并替换模式的第一次出现位置。字符串S T R包含‘poped popo pill’,执行下
列s u b命令s u b(/ o p /," o p ",S T R)。模式o p第一次出现时,进行替换操作,返回结果如下:
‘pO Ped pope pill’。
本章文本文件中,学生J . Tr o l l的记录有两个值一样,“目前级别分”与“最高级别分”。只
改变第一个为2 9,第二个仍为2 4不动,操作命令为s u b(/ 2 6 /," 2 9 ",$ 0),只替换第一个出现
2 4的位置。注意J . Tr o l l记录需存在。
7. substr
s u b s t r是一个很有用的函数。它按照起始位置及长度返回字符串的一部分。例子如下:
上面例子中,指定在域1的第一个字符开始,返回其前面5个字符。
第9章AWK 介绍79
下载
如果给定长度值远大于字符串长度, a w k将从起始位置返回所有字符,要抽取L Ta n s l - e y
的姓,只需从第3个字符开始返回长度为7。可以输入长度9 9,a w k返回结果相同。
s u b s t r的另一种形式是返回字符串后缀或指定位置后面字符。这里需要给出指定字符串及
其返回字串的起始位置。例如,从文本文件中抽取姓氏,需操作域1,并从第三个字符开始:
还有一个例子,在B E G I N部分定义字符串,在E N D部分返回从第t个字符开始抽取的子
串。
8. 从s h e l l中向a w k传入字符串
本章开始已经提到过, a w k脚本大多只有一行,其中很少是字符串表示的。本书大多要求
在一行内完成a w k脚本,这一点通过将变量传入a w k命令行会变得很容易。现就其基本原理讲
述一些例子。
使用管道将字符串s t a n d - b y传入a w k,返回其长度。
设置文件名为一变量,管道输出到a w k,返回不带扩展名的文件名。
设置文件名为一变量,管道输出到a w k,只返回其扩展名。 |
|