上一篇中,主要介绍了awk中的一些基础概念,包括记录与字段、表达式、变量、语句等等,本篇在此基础上进一步介绍下awk中的函数。 awk的函数分成数学函数、字符串函数、I/O处理函数以及用户自定义的函数,其中用户自定义的函数我们在上一篇中也有简单的介绍,下面我们一一来介绍这几类函数。

数学函数

awk 中支持以下数学函数:

  • atan2(y,x):反正切函数;
  • cos(x):余弦函数;
  • sin(x):正弦函数;
  • exp(x):以自然对数e为底指数函数;
  • log(x):计算以e 为底的对数值;
  • sqrt(x):计算平方根函数;
  • int(x):将数值转换成整数;
  • rand():返回0到1的一个随机数值,不包含1;
  • srand([expr]):设置随机种子,一般与rand函数配合使用,如果参数为空,默认使用当前时间为种子;

例如,我们使用rand()函数生成一个随机数值:


[kodango@devops awk_temp]$ awk 'BEGIN {print rand(),rand();}'
0.237788 0.291066
[kodango@devops awk_temp]$ awk 'BEGIN {print rand(),rand();}'
0.237788 0.291066

但是你会发现,每次awk执行都会生成同样的随机数,但是在一次执行过程中产生的随机数又是不同的。因为每次awk执行都使用了同样的种子,所以我们可以用srand()函数来设置种子:


[kodango@devops awk_temp]$ awk 'BEGIN {srand();print rand(),rand();}'
0.171625 0.00692412
[kodango@devops awk_temp]$ awk 'BEGIN {srand();print rand(),rand();}'
0.43269 0.782984

这样每次生成的随机数就不一样了。 利用rand()函数我们也可以生成1到n的整数:


[kodango@devops awk_temp]$ awk '
> function randint(n) { return int(n*rand()); }
> BEGIN { srand(); print randint(10);
> }'
3

字符串函数

awk中包含大多数常见的字符串操作函数。

1. sub(ere, repl[, in])

描述:简单地说,就是将in中匹配ere的部分替换成repl,返回值是替换的次数。如果in参数省略,默认使用$0。替换的动作会直接修改变量的值。 下面是一个简单的替换的例子:


[kodango@devops ~]$ echo "hello, world" | awk '{print sub(/ello/, "i"); print}'
1
hi, world

在repl参数中&是一个元字符,它表示匹配的内容,例如:


[kodango@devops ~]$ awk 'BEGIN {var="kodango"; sub(/kodango/, "hello, &", var); print var}'
hello, kodango

2. gsub(ere, repl[, in])

描述:同sub()函数功能类似,只不过是gsub()是全局替换,即替换所有匹配的内容。

3. index(s, t)

描述:返回字符串t在s中出现的位置,注意这里位置是从1开始计算的,如果没有找到则返回0。 例如:


[kodango@devops ~]$ awk 'BEGIN {print index("kodango", "o")}'
2
[kodango@devops ~]$ awk 'BEGIN {print index("kodango", "w")}'
0

4. length[([s])]

描述:返回字符串的长度,如果参数s没有指定,则默认使用$0作为参数。 例如:


[kodango@devops ~]$ awk 'BEGIN {print length('kodango');}'
0
[kodango@devops ~]$ echo "first line" | awk '{print length();}'
10

5. match(s, ere)

描述: 返回字符串s匹配ere的起始位置,如果不匹配则返回0。该函数会定义RSTARTRLENGTH两个内置变量。RSTART与返回值相同,RLENGTH记录匹配子串的长度,如果不匹配则为-1。 例如:


[kodango@devops ~]$ awk 'BEGIN {
print match("kodango", /dango/);
printf "Matched at: %d, Matched substr length: %d\n", RSTART, RLENGTH;
}'
3
Matched at: 3, Matched substr length: 5

6. split(s, a[, fs])

描述:将字符串按照分隔符fs,分隔成多个部分,并存到数组a中。注意,存放的位置是从第1个数组元素开始的。如果fs为空,则默认使用FS分隔。函数返回值分隔的个数。 例如:


[kodango@devops ~]$ awk 'BEGIN {
> split("1;2;3;4;5", arr, ";")
> for (i in arr)
>     printf "arr[%d]=%d\n", i, arr[i];
> }'
arr[4]=4
arr[5]=5
arr[1]=1
arr[2]=2
arr[3]=3

这里有一个奇怪的地方是for..in..输出的数组不是按顺序输出的,如果要按顺序输出可以用常规的for循环:


[kodango@devops ~]$ awk 'BEGIN {
> split("1;2;3;4;5", arr, ";")
> for (i=0;^C
[kodango@devops ~]$ awk 'BEGIN {
> n=split("1;2;3;4;5", arr, ";")
> for (i=1; i<=n; i++)
>     printf "arr[%d]=%d\n", i, arr[i];
> }'
arr[1]=1
arr[2]=2
arr[3]=3
arr[4]=4
arr[5]=5

7. sprintf(fmt, expr, expr, ...)

描述:类似printf,只不过不会将格式化后的内容输出到标准输出,而是当作返回值返回。 例如:


[kodango@devops ~]$ awk 'BEGIN {
> var=sprintf("%s=%s", "name", "value")
> print var
> }'
name=value

8. substr(s, m[, n])

描述:返回从位置m开始的,长度为n的子串,其中位置从1开始计算,如果未指定n或者n值大于剩余的字符个数,则子串一直到字符串末尾为止。 例如:


[kodango@devops ~]$ awk 'BEGIN { print substr("kodango", 2, 3); }'
oda
[kodango@devops ~]$ awk 'BEGIN { print substr("kodango", 2); }'
odango

9. tolower(s)

描述:将字符串转换成小写字符。 例如:


[kodango@devops ~]$ awk 'BEGIN {print tolower("KODANGO");}'
kodango

10. toupper(s)

描述:将字符串转换成大写字符。 例如


[kodango@devops ~]$ awk 'BEGIN {print tolower("kodango");}'
KODANGO

I/O处理函数

1. getline

getline的用法相对比较复杂,它有几种不同的形式。不过它的主要作用就是从输入中每次获取一行输入。 a. expression | getline [var] 这种形式将前面管道前命令输出的结果作为getline的输入,每次读取一行。如果后面跟有var,则将读取的内容保存到var变量中,否则会重新设置$0和NF。 例如,我们将上面的statement.txt文件的内容显示作为getline的输入:


[kodango@devops awk_temp]$ awk 'BEGIN { while("cat statement.txt" | getline var) print var}'
statement
delete
exit
next

上面的例子中命令要用双引号,"cat statement.txt",这一点同print/printf是一样的。 如果不加var,则直接写到$0中,注意NF值也会被更新:


[kodango@devops awk_temp]$ awk 'BEGIN { while("cat statement.txt" | getline) print $0,NF}'
statement 1
delete 1
exit 1
next 1

b. getline [var] 第二种形式是直接使用getline,它会从处理的文件中读取输入。同样地,如果var没有,则会设置$0,并且这时候会更新 NF, NRFNR


[kodango@devops awk_temp]$ awk '{
> while (getline)
>    print NF, NR, FNR, $0;
> }' statement.txt
1 2 2 delete
1 3 3 exit
1 4 4 next

c. getline [var] < expression 第三种形式从expression中重定向输入,与第一种方法类似,这里就不加赘述了。

2. close

close函数可以用于关闭已经打开的文件或者管道,例如getline函数的第一种形式用到管道,我们可以用close函数把这个管道关闭,close函数的参数与管道的命令一致:


[kodango@devops awk_temp]$ awk 'BEGIN {
while("cat statement.txt" | getline) {print $0;close("cat statement.txt");
}}'
statement
statement
statement
statement
statement

但是每次读了一行后,关闭管道,然后重新打开又重新读取第一行就死循环了。所以要慎用,一般情况下也很少会用到close函数。

3. system

这个函数很简单,就是用于执行外部命令,例如:


[kodango@devops awk_temp]$ awk 'BEGIN {system("uname -r");}'
3.6.2-1-ARCH

结束语

快速了解Awk系列的几篇文章相对比较粗糙,我是参考Awk的man手册以及《Sed & wk》附录B总结而成的,但是应该可以让大家对awk有一个大致的了解,欢迎大家一起交流。 附Peteris Krumins在他博客上发布的一份cheet sheet:awk cheat sheet (.pdf)

Sedawk笔记之awk篇:快速了解Awk(三)相关推荐

  1. 【ApsaraSRE专题推荐--1期】Sedawk笔记系列

    Sed&awk笔记之sed篇 Sed and awk 笔记之 sed 篇:简单介绍 Sed&awk笔记之sed篇:sed基础命令 Sed&awk笔记之sed篇:模式空间与地址匹 ...

  2. Sedawk笔记之awk篇

    Awk是什么 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备 ...

  3. Linux文本三剑客之一——awk详解(1)——awk看这两篇就够啦~PS:文末有练习,来练练手吧

    shell编程三剑客 grep --> egrep --> 文本过滤 查询 awk 文本截取 sed  文本的替换和修改 目录 awk awk也可以做小数运算 awk命令简要处理流程 aw ...

  4. 读书笔记之 sed 篇

    Sed&awk笔记之sed篇:简单介绍 最近在阅读<sed & awk(第二版)>,这本书是sed和awk相关书籍中比较经典的一本.我在读书的时候有一个习惯,就是会作一些笔 ...

  5. H5直播站点运维笔记一 服务器篇

    H5直播站点运维笔记一 服务器 服务器篇 一.CentOS6基础操作 1. 查看服务器版本 2. 查看服务器性能 3. 文件查找 4. 软件查找 5. 用户系统 6. 远程登录工具 二.FTP ( V ...

  6. Sass-学习笔记【进阶篇】

    特别说明: 没有sass基础请移步:[Sass-学习笔记[基础篇]]http://www.cnblogs.com/padding1015/articles/7056323.html 最底部附结构图(实 ...

  7. 《算法笔记》——基础篇习题选择结构

    <算法笔记>--基础篇习题 第二章 C/C++快速入门--2.3选择结构 [习题A] 一元二次方程求根 Problem Description Thinking Notes Code Im ...

  8. Redis学习笔记1-理论篇

    目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...

  9. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

最新文章

  1. 转javascript图片预加载技术
  2. 【vue】.native给组件绑定原生事件
  3. Count SIN Numbers
  4. webstorm快捷键说明
  5. md5加密 java原理_md5 32位 加密原理 Java实现md5加密
  6. 字符串的排序不一定要完全按照字典序(洛谷P1012题题解,Java语言描述)
  7. React Router 学习
  8. MangoTrainingCourse课程hands-on lab-1
  9. 《复联4》首轮公映票房27.5亿美金 超《阿凡达》创纪录
  10. linux中的变量前加__user,linux中的环境变量,别名,变量传递和函数块
  11. 解决Chrome浏览器不能访问https网站的问题
  12. MATLAB三维散点图的绘制(scatter3、plot3)
  13. vibe算法 c++实现
  14. Unity插件——Odin 学习笔记(三)
  15. python判断图片相似度_图像检索系列——利用 Python 检测图像相似度!
  16. python爬虫:批量下载qq空间里的照片(一)
  17. vue获取tr内td里面所有内容_点击td获取tr的所有值
  18. SSM框架学习记录-Spring_day01
  19. 如何禁止NavigationController的向右滑动返回
  20. 电脑怎么用照片做视频?哪个软件简单好用?3步教你轻松制作!

热门文章

  1. 【Node】模块加载过程
  2. OpenCV cv2.putText实现字符串换行'\n'
  3. jQuery的基本语法,选择器,DOM操作
  4. 一个循环、一个变量打印乘法口诀
  5. jQuery轮 播的封装
  6. 矩阵快速幂的一份小结
  7. 【云计算】使用privilege权限对Docker内核参数进行定制
  8. PHP5.6.6上运行 ecshop 2.7.3常见问题处理
  9. 【Scrum】2010.12.27
  10. 使用ifstream和getline读取文件内容[c++]