文本数据处理之awk
一、awk简介 ? ? ?awk是一种优良的文本处理工具。它不仅是 linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。 awk提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。最简单地说, awk 是一种用于处理文本的编程语言工具。 ? ? ?awk与grep,sed是处理文本数据必不可缺且必须熟练的处理工具。 ? ? ?grep : 文本过滤器 ? ? ? sed:流编辑器 ? ? ?awk : 报告生成器 二、awk的输出 ? ? ?awk其输出格式有两种:print和printf ? ? ?print是简单的显示命令,printf 是格式化显示命令 1、print的使用格式 ? ?print item1,item2,... ? ① 各项目之间使用逗号隔开,而输出时则以空白字符分隔; ? ② 输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出; ? ③ print命令后面的item可以省略,此时其功能相当于print $0,因此,如果想输出空白行,则需要使用print ""; ? ? 2、printf的使用格式 ? ? ? printf format,item1,... ?① 其与print命令的最大不同是,printf需要指定format; ?② format用于指定后面的每个item的输出格式; ? ? ? 每一个格式对应一个字段 ?③ printf不会自动打印换行符;n ? 3、format ? format格式的指示符都以%开头,后跟一个字符; ? ① %c: 显示字符的ASCII码; ? ② %d,%i:十进制整数; ? ③ %e,%E:科学计数法显示数值; ? ④ %f: 显示浮点数; ? ⑤ %g,%G: 以科学计数法的格式或浮点数的格式显示数值; ? ⑥ %s: 显示字符串; ? ⑦ %u: 无符号整数; ? ⑧ %%: 显示%自身; 4、修饰符 ? ① N: 显示宽度; ? ② -: 左对齐; ? ? ③ +:显示数值符号,默认为右对齐; 三、awk的变量 1、awk内置变量之记录变量: ? ? ? FS : field separator,读取文件本时,所使用字段分隔符; ? ? ? RS : Record separator,输入文本信息所使用的换行符; ? ? OFS : Output Filed Separator,文件分隔符; ? ? ORS:Output Row Separator,行分隔符; ? ? 2、awk内置变量之数据变量: ? ? ?NR: The number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数; ? ? ?NF:Number of Field,当前记录的field个数; ? ? ? ? ?FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数; ? ? ?ARGV: 数组,保存命令行本身这个字符串,如awk '{print $0}' a.txt b.txt这个命令中, ? ? ? ? ? ARGV[0]保存awk,ARGV[1]保存a.txt; ? ? ? ?ARGC: awk命令的参数的个数; ? ? ?FILENAME: awk命令所处理的文件的名称; ? ? ?ENVIRON:当前shell环境变量及其值的关联数组; 3、用户自定义变量 ? ? ?gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。 ? ?① 脚本中赋值变量 ? ? ?在gawk中给变量赋值使用赋值语句进行 ? ?② 命令行中使用赋值变量 ? ? ?gawk命令也可以在“脚本”外为变量赋值,并在脚本中进行引用。 四、输出重定向 ?1、 print items > output-file ? ? ? ?print items >> output-file ? ? ? ?print items | command ?2、特殊文件描述符: ? ? ? /dev/stdin:标准输入 ? ? ? /dev/sdtout: 标准输出 ? ? ? /dev/stderr: 错误输出 ? ? ? /dev/fd/N: 某特定文件描述符 五、awk的操作符 ?1、算术操作符: ? ? ? -x: 负值 ? ? ?+x: 转换为数值; ? ?x^y: 次方 ? ?x**y: 次方 ? ? x*y: 乘法 ? ?x/y:除法 ? ?x+y: 加法 ? ? x-y: 减法 ? ?x%y: 取余 ?2、字符串操作符: ? ?只有一个,而且不用写出来,用于实现字符串连接; ?3、赋值操作符: ? ? =、 +=、-=、*=、/=、%=、^=、**=、++、-- 注:如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代; ?4、布尔值 ? ? ?awk中,任何非0值或非空字符串都为真,反之就为假, 与bash完全相反。 ?5、比较操作符 ? ?x < y ?小于 ? ?x <= y ?小于或等于 ? ?x > y ?大于 ? ?x >= y ?大于或等于 ? ? ?x == y ?等于 ? ?x != y ?不等于 ? ?x ~ y ? 被匹配的字符 ? ?x !~ y ?不被匹配的字符 ? ?6、表达式间的逻辑关系符 ? ?&& ? ?与 ? ? | ?| ? ? 或 ? ?7、条件表达式 ? ?selector?if-true-exp:if-false-exp if selector; then if-true-exp else if-false-exp fi ?8、函数调用 ? ?function_name (para1,para2) ? ? 多个参数用逗号隔开 六、awk的输出模式 awk 'program' input-file1 input-file2 ... ? 其中的program为: ? ?pattern { action } ? ?...... ? ? ?2、常见的模式类型: ? ? Regexp: 正则表达式,格式为/regular expression/ ? ? expresssion: 关系表达式,其值非0或为非空字符时满足条件,可以是字符串或数字的比较 ? ? Ranges: 指定的匹配范围,格式为pat1,pat2 ? ? BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次 ? ? BEGIN模式是 在真正处理之前做些准备工作的功能,END模式是 在运行之后输出相关信息。 ? ? ? Empty(空模式):匹配任意输入行; ?3、常见的语句动作 ? ? Expressions : ?表达式 ? ? Control statements: 控制语句 ? ? Compound statements : 组合语句 ? ? Input statements : ?输入语句 ? ? Output statements : 输出语句 七、控制语句 ? 1、if-else ? 语法:if (condition) {then-body} else {[ else-body ]}
# awk -F: '{if ($1=="root") printf "%-15s: %sn",$1,"Admin"; else printf "%-15s: %sn","Common User"}' /etc/passwd ? ? 2、while ? ? 此while语句在awk中的作用体现是要么做成的循环体,要么在某个片上的循环 ? 语法: while (condition){statement1; statment2; ...} ? # awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd ? ? 3、do-while ? ? 与while语句不同之处在:不管条件真假先执行一次循环体,再执行控制语句 ? 语法: do {statement1,statement2,...} while (condition) ? # awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd ? ? 4、for ? 语法: for ( variable assignment; condition; iteration process) { statement1,...} ? # awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd ? ? ? for循环还可以用来遍历数组元素 ? 语法: for (i in array) {statement1,'microsoft yahei';color:#00B0F0;"> ? # awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%in",A,BASH[A]}}' /etc/passwd ? 5、case ? 语法:switch (expression) { case VALUE or /REGEXP/: statement1,... default: statement1,...} ? 6、break 和 continue ? ? 常用于循环或case语句中 ? 7、 next ? ? 提前结束对本行文本的处理,并接着处理下一行 ? # awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd 八、awk中使用的数组 ? 1、数组 ? ? ?array[index-expression] ? ? ?index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。 # netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}' ? 2、要遍历数组中的每一个元素,需要使用如下的特殊结构 ? ? for (var in array) { statement1,... } ? ? 其中var用于引用数组下标,而不是元素值 ? 3、删除数组变量 ? ?从关系数组中删除数组索引需要使用delete命令。使用格式为 ? ? delete ?array[index] 九、awk的内置函数 ? 1、split(string,array [,fieldsep [,seps ] ]) ? ?功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从0开始的序列; ? 2、length([string]) 返回string字符串中字符的个数; ? 3、substr(string,start [,length]) ? ?功能:取string字符串中的子串,从start开始,取length个;start从1开始计数; ? 4、system(command) 执行系统command并将结果返回至awk命令 ? 5、systime() ? ?功能:取系统当前时间 ? 6、tolower(s) ? ?功能:将s中的所有字母转为小写 ? 7、toupper(s) ? ?功能:将s中的所有字母转为大写 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |