文章目录
这个是我自己写的 全部关于 awk学习的目录导航 ,感兴趣的可以看看。
只写一些我觉得会用到的 函数:
字符串函数:
gsub(r,s) —— 将范围内所有r 替换为 s
示例如下:
root@zhengzelin:~# cat test1
Bob Alice job Peter
bob
root@zhengzelin:~# awk '{gsub("b","B")} {print $0}' test1
BoB Alice joB Peter
BoB
root@zhengzelin:~# awk '{gsub("b","B",$1)} {print $0}' test1
BoB Alice job Peter
BoB
当你 指定 $1 的时候,代表只更换 $1 的字母,不指定 默认为 $0。
也可以根据"正则表达式" 来 更换:
root@zhengzelin:~# cat test1
Bob Alice job Peter
bob
root@zhengzelin:~# awk '{gsub("[a-z]","2",$1)} {print $0}' test1
B22 Alice job Peter
222
root@zhengzelin:~# awk '{gsub("[A-Z]","2")} {print $0}' test1
2ob 2lice job 2eter
bob
sub(r,s) —— 将范围内第一个r换为s
gsub 会将所有满足条件的字符给替换掉,而 sub 只会替换掉每一行的第一个匹配的!
root@zhengzelin:~# cat test1
Bob Alice job Peter
bob
root@zhengzelin:~# awk '{gsub("b","z")} {print $0}' test1
Boz Alice joz Peter
zoz
root@zhengzelin:~# awk '{sub("b","z")} {print $0}' test1
Boz Alice job Peter
zob
length(s) —— 获取s的长度
root@zhengzelin:~# cat test1
Bob Alice job Peter
bob
root@zhengzelin:~# awk '{print $1,length($1)}' test1
Bob 3
bob 3
当在 length() 中没有指定参数的时候,默认为 $0
root@zhengzelin:~# awk '{print $1,$2,length()}' test1
Bob Alice 20
bob 5
index(a,b) —— 返回a中b的位置:
root@zhengzelin:~# cat test1
Bob Alice job Peter
bob
root@zhengzelin:~# awk '{print index($0,"o")}' test1
2
2
使用 index函数,在每一行中寻找字符“o”,如果当前行中存在字符串“o”,则返回当前行中“o”的位置,如果不存在则返回数字“0”
如上图所示,字符“o”在每行的第二个字符,所以返回数字“2”
root@zhengzelin:~# cat test1
Bob Alice job Peter
bob
root@zhengzelin:~# awk '{print index($0,"job")}' test1
11
0
空格也算一个字符!
split 函数 ——切割字符串
在学习数组的时候,讲到了:"其他语言中,数组的下标是从0开始的,而awk中默认是从1开始" ;
为什么是1呢?就是因为这个函数: "split函数!"
我们可以借助 "split函数" 动态的生成"数组",而不用"手动去设置数组中每个元素的值";
通过 “split函数” 我们可以 “将指定的字符串按照指定的分隔符切割,将切割后的每一段赋值到数组的元素中去,从而创建动态数组”!
如上图所示:使用 split函数 将 变量 test 里的字符串 以 " "(空格) 为分隔符,将其划分开!然后将分开的每一段字符串自动的赋值到数组arrayname 中 。但是注意:我们一定发现了,上面输出元素下标的时候,是从1开始的,而不是0!
当然,spilt函数 也是有返回值的! 它的返回值就是它将一个字符串分为了几段!
使用上面的方法,有时候数组中元素输出的顺序 可能与 字符串字符的顺序不一样,原因就是在 数组那章中提到的(awk 中的数组本质 上就是 关联数组,所以 默认打印出的元素就是无顺序的!)如果出现了这种情况,建议使用下面的方法:
root@zhengzelin:~# awk -v test="bb dd aa cc " 'BEGIN{arraylen=split(test,arrayname," ");for (i=1;i<=arraylen;i++){print i,arrayname[i]}}'
1 bb
2 dd
3 aa
4 cc
解释:首先使用 split函数 生成了数组,并将 split的返回值 保存在了 "arraylen 变量"中;
然后利用 for 循环中的 变量递增,按照顺序输出了数组中的对于下标及元素值!
当然还有一种方法:就是下面的那个函数 asort:
其他函数
asort函数 —— 根据元素值顺序排序
root@zhengzelin:~# awk -v test="bb dd aa cc " 'BEGIN{split(test,arrayname," ");for (i in arrayname){print i,arrayname[i]}}'
1 bb
2 dd
3 aa
4 cc
root@zhengzelin:~# awk -v test="bb dd aa cc " 'BEGIN{split(test,arrayname," ");asort(arrayname);for (i in arrayname){print i,arrayname[i]}}'
1 aa
2 bb
3 cc
4 dd
对比一个就可以发现哪里不一样。元素值被排序后输出了!
但是,当下标不为数字的时候:
asort函数的返回值
函数 asort 的返回值其实就是:数组中 元素的数量!
所以,利用这一点,我们可以这样写: