awk使用

来源:互联网 发布:学会c语言能干什么 编辑:程序博客网 时间:2024/04/26 01:46

awk的使用看起来比较复杂..貌似有一本好几百页的书就是讲awk的..所以我这里不多言..也就说点常用的命令和了解..


awk处理的是行数据..也就是说awk以行为单位对文件进行处理..它将每行分为不同的域..从1开始标号..分割符默认为空格..但是可以其后指定

基本命令格式:

awk -Fch 'command' files

ch是分隔符..默认为空格..可以不写..也可以是任意字符..

comman是awk要执行的命令..针对每一行进行处理..

files是输入的文件..可以是多个文件或目录..遵循glob元字符处理


awk -f script.file files

我们也可以将指令写到script.file中..这script.file中内容就相当于command..内部无需再加单引号了..直接命令就可以了..


script.file files

我们也可以类似shell一样执行脚本..有两点要求..1是script.file开头必须按惯例写上执行程序..必须写成#!/bin/awk -f..后面这个-f必须有..2是该文件必须可执行

第二种格式中的script.file就无需满足这个条件..仅仅作为命令的集合即可


command内部其实很类似C语言..分为多个执行语句..语句间以空格相隔..每条语句有两部分..一个是条件..一个是命令..只有当条件满足时才会执行命令

如awk '$1~/23/ {print $0}' file

注意..命令必须用"{}"括起来..


其实这个条件呢..也可以写到命令里..不过这样其实就是说原先的条件永远满足..执行命令时再行判断..

如 awk '{if($1~/23/) print $0}' file

这个命令表示一直执行该命令..但是该命令内部有自己的判断..注意..这种语句类似C..如果有多个语句的话..也必须用"{}"括起来..而且语句间也必须用";"(分号)隔开


awk中有两个预设的指令..BEGIN表示在读取文件之前进行的命令..END表示读取文件之后的命令..同时还有一些预设的变量..$no.表示的就是第几个域..$0表示的是该行全部内容..


内置变量:

ARGC:命令行参数个数

ARGV:命令行参数..可以使用ARGV[index]进行索引

ENVIRON:环境参数..也是数组..该数组可以通过ENVIRON[name]索引..同其他动态语言一样..name可以为字符串..

FILENAME:处理的文件名

FNR:文件数量

FS:分隔符..这个既可以读取.也可以设定

NF:域的个数

NR:已读行数

OFS:输出域的分割符(默认是空格)..也是既可读..又可设定

ORS:输出记录分隔符..默认是换行(即输出的每行之间的分割符)

RS:控制记录分隔符..也即是BEGIN之后..END之前的符号..默认是换行符..既可读..又可设定


awk的符号基本同C..仅有正则表达式不一样..//之间为扩展型正则表达式..~表示匹配..!~表示不匹配..其他差不多..


在awk中..除了预设变量我们还可以自定义变量使用..这些变量类似shell..无需声明..直接使用..不同的是这个没有$..跟普通变量无异


awk内置函数如下:


除了常用的print命令外..我们还可以格式化输出.这个很像C里的.printf format_str,var1,var2..具体符号意义如下:




awk中也有流程控制结构,大部分都和C类似..如if else if, while{},do{}while;for(;;){}

唯一的不同是有for in循环..for(var in array){}..


当然..也有break/continue的类似用法..不过有两个很有意思的东东

next:直接截断本行处理..直接读取下一行进行处理

exit:调出执行..直接进入END命令..


awk默认操作是打印输出行..但是如果我们在BEGIN和END中定义有命令..即中间出现了{}.那么默认操作就不执行了..如果我们仅仅想记录某值..那么请不要用{}..而是直接书写命令即可..或者用()括起来也可


awk 'tot+$6; END {print "total is "tot}' file

awk '(tot+$6); END {print "total is "tot}' file

就可以把file中第六域相加并在最后输出总和..此时默认打印操作仍然执行


但是这样的话:

awk '{tot+$6} END {print "total is "tot}' file

就只输出总和了..因为我们使用了{}..它代表着awk中间的命令..而语句或者()内语句仅仅是辅助命令..不影响命令本身执行..


这点区别..请体会之..


当然.最重要还是man之..google之..使用之..

原创粉丝点击