awk 内置字符串函数操作实例
awk中,简单的字符串赋值和拼接操作可以通过直接书写而实现(内部支持),但是,更加复杂的
操作必须使用字符串操纵函数实现.
由此见, awk语法 和 C 语言还是非常接近的。函数名称,输入参数,输出参数
学习一门语言,应该面向数据(借用面向对象的说法),所以你要关注数据,变量和数组。
--------------------------------------------------------------------------------
1. 获取字符串长度:length([s])
--------------------------------------------------------------------------------
[hjj@Dell ~]$ awk 'BEGIN{str="string";print length(str)}'
6
array 也可以用length() 返回数组个数
--------------------------------------------------------------------------------
2.获取子串substr(s,i,[,n])
--------------------------------------------------------------------------------
[hjj@Dell ~]$ awk 'BEGIN{str="string";print substr(str,1,4)}'
stri
--------------------------------------------------------------------------------
3.替换及全局替换sub(r,s,[,t]), gsub(r,s,[,t])
--------------------------------------------------------------------------------
[hjj@Dell ~]$ awk 'BEGIN{str="test string 123 and 456";gsub(/[0-9]+/,"!",str);print str}'
test string ! and !
[hjJ@Dell ~]$ awk 'BEGIN{str="test string 123 and 456";sub(/[0-9]+/,"!",str);print str}'
test string ! and 456
--------------------------------------------------------------------------------
4. 分割字符串split(s,a,[,r])
--------------------------------------------------------------------------------
[hjj@Dell ~]$ awk 'BEGIN{str="this is test string";split(str,array, " "); for(k in array){print k,array[k];}}'
4 string
1 this
2 is
3 test
打印的顺序是乱的? 想按顺序,如下所示即可:
for(k=1;k<=lenth(array);k++){print k,array[k];}
--------------------------------------------------------------------------------
5. 格式化输出printf(fmt,expr-list), sprintf(fmt,expr-list)
--------------------------------------------------------------------------------
[hjj@Dell ~]$ awk 'BEGIN{a=1;b=2.2;printf("a:%d, b:%.2f\n", a, b)}'
a:1, b:2.20
sprintf() 返回输出字符串
[hjj@Dell ~]$ awk 'BEGIN{str=sprintf("%x",100);print str}'
64
--------------------------------------------------------------------------------
6. index(s,t)
--------------------------------------------------------------------------------
[hjj@hjj ~]$ echo hello |awk '{print index($0,"ll")}'
3
--------------------------------------------------------------------------------
7. match(s,r,[,a]), substr(s,RSTART,RLENTH)
--------------------------------------------------------------------------------
[hjj@hjj ~]$ echo "pbyOddKey: 29 AD 9C 72 58 3A 2B BD" |awk --re-interval '{if(match($0,/([0-9A-Z]{2} ){7,}/)) print substr($0,RSTART,RLENGTH+2)}'
29 AD 9C 72 58 3A 2B BD
就不一一列举了, 熟能生巧。 记不住就看man
如前所述,awk 中没有任何字符数据类型,如果你想要遍历字符串的每个字符,必须把字符串中的每个字符当成连续的单字符子字符串处理。
----------------------------------------
awk 中的数据类型及3个函数:
typeof()
sprintf()
strtonum()
----------------------------------------
awk由于没有单步调试的环境,所以更需要了解每个变量的相关信息
虽然awk 不用显式指明类型, 但也是有内部类型的,并且会根据上下文来转换
所以需要了解这部分知识来进一步控制它的转换.
如果你想检查它的数据类型,可以用typeof() 函数, 会返回7种类型之一
"array",
"number",
"string",
"strnum",
"regexp",
"unassigned"
"undefined".
这里的array, 应该理解为广义的array, 不单单是普通的下标数组, 实际上这里的数组是用关联数组实现的.(这里并不关心其具体实现方式,;序列数组?map数组?tree数组?等等)
如果你想影响它的数据类型,可以用隐式方式. 例如 a+0, 其结果会变成整数, a"" 其结果会变成字符串,不管原来a是什么类型
实验:
$ awk 'BEGIN{a="123";print typeof(a); print typeof(a+0); print a+1};'
string
number
124
$ awk 'BEGIN{a=123;print typeof(a); print typeof(a""); print a""1};'
number
string
1231
也可以用显示方式改变数据类型(即调用函数). sprintf, 其输出为字符串, strtonum, 其输出为数值
例:
$awk 'BEGIN{a="123";print typeof(a); print typeof(strtonum(a)); print strtonum(a)+1};'
string
number
124
$ awk 'BEGIN{a=123;print typeof(a); print typeof(a""); print a""1};'