版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、linux awk看就懂awk 是 linux 环境下的一个命令行工具,但是由于 awk 强大的能力,我们可以为 awk 工具传 递一个字符串,该字符串的内容类似一种编程语言的语法,我们可以称其为 Awk 语言,而 awk工具本身则可以看作是 Awk 语言的解析器。就好比python 解析器与 Python 语言的关系。我由于 awk 天生提供对文件中文本分列进 ( 常见的是空格 ) 隔开,我们可以将这个 awk 进行处理,其实 awk 在工作中很多们一般使用 awk 来做什么, awk 又适合做什么工作呢 行处理,所以如果一个文件中的每行都被特定的分隔符 文件看成是由很多列的文本组成,这样的
2、文件最适合用 时候被用来处理 log 文件,进行一些统计工作等。awk 命令的一般组成awk 最常用的工作一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理,一个 完整的 awk 命令形式如下:awk options BEGIN commands pattern commands END commands file其中 options 表示 awk 的可选的命令行选项,其中最常用的恐怕是 -F 它指定将文件中每一 行分隔成列的分隔符号。而紧接着后面的单引号里面的所有内容是 awk 的程序脚本, awk 需要 对文件每一行分割后的每一列做处理。 file 则是 awk 要处理的文件名称
3、。 让我们通过 demo 来 体会 awk 的功能。awk 对每一行进行分割处理echo 11 22 33 44 | awk print $3 $2 $1输出: 33 22 11我们将字符串 11 22 33 44 通过管道传递给 awk 命令,相当于 awk 处理一个文件,该文件 的内容就是 11 22 33 44 上面的命令中我们并没有添加 -F 指定分割符号,实际上默认情况 下 awk 使用空格分割每一行, 如果需要指定别的字符则使用 -F 显示指定。上面的命令是将 11 22 33 44 通过空格 ( 不管列之间有多少个空格都将当作一个空格处理 ) 分割成 4 列,在 awk 中有 一
4、种通过 $数字 引用的变量,这种变量引用的内容就是当前行中分割的每一列的内容,数字 的序号从 1 开始,例如 $1 表示第 1 列的内容, $2 表示第二列,以此类推。 $0 表示当前整行的 内容。 print 是 awk 的内置函数,用于打印出变量的值。 而我们在 $3 $2 $1 之间添加了用 双引号引起来的空格,如果没有,则这些变量的值打印出来会连在一起。这里的 awk 命令中 里面的内容实际上是我们上面完整模式的中间部分,我们省略了上面的 BEGIN 块, END 块,并 且中间的程序块我们也省略掉了 pattern 部分,也就是如果不添加 BEGIN 或者 END 说明那么 该程序块
5、就是上面完整模式中的中间的那个程序块, 该中间的程序块所执行的操作就是循环处理 文件内容的每一行,如果文件有 10 行,那么中间的程序块要运行 10 次,每一次处理一行的内 容,并且处理完当前行之后,下次循环会自动依次处理接下来的行内容。我们来看看,如果有两列是什么效果呢,例如:echo -e 11 22 33 44naa bb cc dd | awk print $3 $2 $1输出:33 22 11cc bb aa注意这里 echo 命令使用了 -e 选项的目的就是为了保持字符串中的 n 的格式能够生效, 否则该 换行将被忽略。那么上面的命令是如何执行的呢,我们模拟一下 awk 的执行过程
6、,首先 awk 读 取第一行的内容,使用空格分隔该行中的列, 并将字符串 11 赋值给 $1 ,22 赋值给 $2 ,33 赋值 给$3 ,44 赋值给 $4 。然后通过 print 打印出来。接着读取第二行的内容,同样执行上面的操 作。使用 parttern 部分我们已经学习了 awk 最简单的命令, 下面我们再加一点东西进去, 在程序块的前面添加 pattern 部分,例如:echo -e 1 2 3 4n5 6 7 8 | awk $12print $3 $2 $1输出: 7 6 5该程序与上面的程序几乎一样, 只不过我们在程序块前面添加了 $12 表示如果当前行的第 1 列的值大于 2
7、 则处理当前行, 否则不处理。 说白了 pattern 部分是用来从文件中筛选出需要处 理的行进行处理的,如果没有则循环处理文件中的所有行。 pattern 部分可以是任何条件表达 式的判断结果,例如 ,=,=,=,!= 同时还可以使用 +,-,*,/ 运算与条件表达式相 结合的复合表达式,逻辑 & ,| ,! 同样也可以使用进来。另外 pattern 部分还可以使用 / 正则 / 选择需要处理的行。awk 的 BEGIN 语句块BEGIN 语句块是在匹配文件第一行之前运行的语句块。由于是匹配第一行之前运行,实际上在BEGIN 语句块中 $n 是不可用的。一般情况下可以在 BEGIN 语句块中
8、做一些变量 (awk 中可以 自定义变量,直接为一个变量赋值就定义了一个变量,awk 中没有专门定义变量的关键字 ) 初始化的工作,以及一些只需要在开始仅打印一次的输出信息 ( 例如输出表的表头 ) 。例如:echo -e 1 2 3 4n5 6 7 8 | awk BEGINprint c1 c2 c3;print print$3 $2 $1输出为:c1 c2 c3 3 2 17 6 5注意一个语句块 ( 花括号包围 ) 中可以有多条语句,使用分号隔开,这与 C 语言一样。如果需要 单独打印空行,需要使用 print 我们上面就实现了输出表头的效果。awk 的 END 语句块END语句块是在
9、awk循环执行完所有行的处理之后,才执行的,与BEGIN 一样,END语句块也只执行一次,我们看看完整的例子。echo -e 1n2n3| awk BEGINprint beginprint$1ENDprint end输出: begin123endawk 定义变量对列求和test.txt 的内容如下:11 22 3323 45 3422 32 43awk BEGINsum=0sum+=$1ENDprint sum test.txt输出结果: 56首先在 BEGIN 语句块中为变量 sum 赋值 0,然后在循环语句块中将每一行的第 1 列加到 sum 中,当文件的所有行全部循环处理完成之后,打印
10、出sum 变量的值。当然这个例子中 BEGIN 语句块是可以省略的,我们可以直接在循环语句块中使用sum 变量,此时 sum 第一次使用,该变量会自动被建立,默认的初始值是 0 。awk 中的判断语句awk 的所有语句块中都可以使用判断语句,其判断语句语法与 C 语言一样。/test.txt 内容如下1 2 34 5 67 8 910 11 12awk if($1%2=0)print $1 $2 $3 test.txt输出:4 5 610 11 12awk 中的循环/while 循环awk BEGINcount=0;while(count5)print count;count +;输出:012
11、34可以看出 awk 的一个语句块中可以有比较复杂的复合语句,其使用与C 语言几乎差不多,多条语句之间用分号隔开,复合语句块用花括号括起来做分隔。/do.while循环awk BEGINcount=0;doprint count;count+while(count5)输出:01234/for 循环awk BEGINfor(count=0;count5;count+)print count 输出:与上面一样awk 中也使用可以看到这几种循环的形式与 C 语言是一样的,对于我们理解没有任何障碍。 break 退出循环,使用 continue 跳过本次循环,其含义与
12、C 语言一样使用数组分组求和, for.in 循环awk 中的数组基本上可以看作是字典,看下面的例子:/test.txt 的文件内容zhangsan 2 3lisi 5 6zhangsan 8 9lisi 11 12wangwu 33 11将所有第一列相同的分成一个组,并将该组中的第二列求和。awk sum$1+=$2ENDfor(k in sum)print k sumk test.txt输出:zhangsan 10lisi 16wangwu 33这个例子里面使用了 for.in循环来遍历数组的 key ,同时通过 key 来得到数组的值。对于key 不是
13、数字的数组,是不能通过普通的 for 循环来以数字索引访问数组元素的。我们可以通 过 length() 函数来获得数组的元素个数,例如 length(array)awk中的操作符与优先级列表级别JhJh-圧諄何说明1哦值、运算、哦值2II谴辑或3再辑或41按位或5/X按位异或6&r按位与7=J=等于、不等于S:小于等于、大于等于、小于、犬于0按位左移、核位右移10+厂加、减11乘、馀、取模121严逻辑非、按位取反或补码13-f+正、负awk的内置函数awk定义了很多内置函数,下面我们根据函数类型列岀常用的函数,下面的函数只是一部分, 完整的函数列表则需要查阅awk的官方文档。算术:atan2(
14、y,x) 返回y/x 的反正切cos(x)返回x的余弦;x是弧度。sin(x)exp(x)log(x)返回x的正弦;x是弧度。返回x幕函数。返回x的自然对数。sqrt(x)返回x平方根。in t(x)返回X的截断至整数的值。ran d()返回任意数字 n,其中0 = n 1。sran d(expr)将rand函数的种子值设置为Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。字符串:gsub(reg,str1,str2) sub(reg,str1,str2) 个匹配使用str1 替换所有str2中符合正则表达式reg的子串含义与gsub相同,只不过gsub是替换
15、所有匹配,sub只替换第一in dex(str,substr)返回substr 在str中第一次岀现的索引,注意索引从1开始计算,如果没有则返回 0length(str) 返回 str 字符串的长度, length 函数还可以返回数组元素的个数 blength(str) 返回字符串的字节数match(str,reg) 与 index 函数一样,只不过 reg 使用正则表达式,例如 match(hello,/lo/)split( str,array,reg)将 str 分隔成数组保存到 array 中,分隔使用正则 reg ,或者字符串都可以,返回数组长度tolower(str)转换为小写tou
16、pper(str)转换为大写substr(str,start,length) 截取字符串,从 start 索引开始的 length 个字符,如不指 定 length 则截取到末尾,索引从 1 开始其他:system(command) 执行系统命令,返回退出码mktime( YYYY MM dd HH MM ss DST) 生成时间格式strftime(format,timestamp) 格式化时间输出,将时间戳转换为时间字符串systime() 得到时间戳 , 返回从 1970 年 1 月 1 日开始到当前时间 ( 不计闰年 ) 的整秒数awk 的内置变量awk 中同样定义了很多内置变量,我们
17、可以直接像使用普通变量一样使用他们,由于 awk 的版 本众多,有些内置变量并不是得到所有 awk 版本的支持。说明: ANPG 表示支持该变量的工具, A=awk 、 N=nawk 、 P=POSIXawk 、 G=gawk$n 当前记录的第 n 个字段,比如 n 为 1 表示第一个字段, n 为 2 表示第二个字段。$0 这个变量包含执行过程中当前行的文本内容。N ARGC 命令行参数的数目。G ARGIND 命令行中当前文件的位置(从 0 开始算)。N ARGV 包含命令行参数的数组。G CONVFMT 数字转换格式(默认值为 %.6g )。P ENVIRON 环境变量关联数组。N ERRNO 最后一个系统错误的描述。G FIELDWIDTHS 字段宽度列表(用空格键分隔)。A FILENAME 当前输入文件的名。P FNR 同NR,但相对于当前文件。A FS 字段分隔符(默认是任何空
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人住宅装潢协议范本(2024年修订)版
- 2025年度叉车安全操作培训课程优化与推广合同4篇
- 2025版厂房买卖及土地使用权变更与售后服务合同4篇
- 专业咨询顾问合作合同(2024年度版)版B版
- 2025年度拆除宴会厅墙体改造项目施工协议4篇
- 2024陶瓷杯系列新品研发与市场推广合作合同3篇
- 2025年度企业股权激励计划税务筹划与合规合同3篇
- 2025年新能源电站设备购销合同协议4篇
- 2025年度医疗中心场地租赁及医疗设备租赁补充协议3篇
- 2025年度医疗设备存放租赁合同(2025年度)4篇
- 茶室经营方案
- 军队文职岗位述职报告
- 小学数学六年级解方程练习300题及答案
- 电抗器噪声控制与减振技术
- 中医健康宣教手册
- 2024年江苏扬州市高邮市国有企业招聘笔试参考题库附带答案详解
- 消费医疗行业报告
- 品学课堂新范式
- GB/T 1196-2023重熔用铝锭
- 运输行业员工岗前安全培训
- 公路工程安全风险辨识与防控手册
评论
0/150
提交评论