文本处理三剑客之awk

简介

awk是一种处理文本文件的语言,是一个强大的文本编辑工具。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理。

gawk

用法:gawk [options] 'PATTERN{ACTION STATEMENTS}' FILE...

                gawk [options]'program'FILE...

                                   program : PATTERN{ACTION STATEMENTS}

选项(options)

-f file :指定awk脚本文件

-F:输入数据时的字段分割符

-v:var=value:自定义变量

分割符、域和记录

awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。

$0为所有域, 注意:和shell中变量$符含义不同

文件的每一行称为记录

省略action,则默认执行 print $0 的操作

示例

从passwd文件中取出user,uid,shell

# awk -F: '{print $1,$3,$7}' /etc/passwd

PATTERN

1)空模式,匹配每一行

2)/正则表达式/:仅处理被模式匹配到的行

3)关系表示式(条件表示式):布尔值类型,结果为真(非0或非空字符串)则处理;结果为假(0或空字符串)则不处理

4)地址定界;支持PATTERN和条件表达式;不支持数字直接定界

5)BEGIN/END模式;BEGIN{}:仅在文本处理之前执行;END{}:仅在文本处理完成之后执

ACTIONS

表达式

三目表达式:selector?if-true-expression:if-false-expression

如果selector为真,则执行if-true-expression;如果selector为假,则执行if-false-expression。

控制语句

1)if-else 语法:if(condition) statement [else statement]

2)while 语法:while(condition) statement 条件真进入循环,条件假退出循环

3)do-while 语法:do statement while(condittion) 先执行一次do,然后判断是否进入循环

4)for 语法:for(variable assignment; condition; iteration process){for-body}

*特殊用法:能够遍历数组中的元素,for(var in array) {for-body}

5)switch 语法:switch(expression) {case VALUE1 or /PEGEXP/: statement; case VALUE2 or /PEGEXP2/: statement; ... ;default: statement}

6)next:控制awk的内生循环,提前结束对本行的处理直接进入下一行

7)continue | break | exit:退出循环,和shell中用法相同

组合语句

组合语句需要将多条语句放到大括号内

输入语句

输出语句

print item1, item2, ... 输出命令

1)逗号为分隔符

2)输出的各item可以是字符串,也可是数值当前记录字段、变量或awk的表达式

3)如果省略item,则相当于print $0

printf FORMAT, item1, item2, ...:格式化输出命令

1)FORMAT必须要给出

2)不会自动换行,需要显示给出换行控制符,\n

3)FORMAT中需要分别为后面的每个item指定一个格式化符号

4)格式符

  • %c:显示字符的ASCII码;
  • %d,%i:显示十进制整数;
  • %e,%E:科学计数法数值显示;
  • %f:显示为浮点数;
  • %g,%G:以科学技术法或浮点数形式显示数值;
  • %s:显示字符串;
  • %u:无符号整数;
  • %%:显示%自身

5)修饰符

  • M[.N]:M控制数组显示的宽度,N控制小数点的精度
  • -:左对齐显示,默认右对齐
  • +:显示数值的符号

变量

内建变量

FS:输入字段分隔符,默认为空白字符

示例:从passwd文件中取出user,uuid,shell

#awk -v FS=":" '{print $1,$3,$7}' /etc/passwd

OFS:输出字段分隔符,默认为空白字符

示例:从passwd文件中取出user,uuid,shell并以“:”为分隔符输出

#awk -v FS=":" -v OFS":"  '{print $1,$3,$7}' /etc/passwd

RS:输入记录分隔符

示例:以空格为换行符打印

# awk -v FS" "  '{print}' /etc/passd

ORS:输出记录分隔符

NF:字段数量;{print $NF}:表示最后字段值

示例:输出每行有多少个字节

# awk '{print NF}' /etc/passwd

NR:行数,对不同文件行数累加计数

示例:输出文件行号(有多少行)

# awk '{print NR}' /etc/passwd 

FNR:行数,对不同文件行数分别计数

示例:两个个文件分别打印行号

# awk -F: '{print FNR}' /etc/passwd /etc/fstab

FILENAME:显示当前文件名

ARGC:命令行参数个数

示例:打印命令行有几个参数

# awk -F: 'BEGIN{print ARGC}' /etc/passwd /etc/fstab

ARGV:数组,保存的是命令行中给定的各参数,使用ARGV[#]引用

示例:打印命令行第1个参数

# awk -F: 'BEGIN{print ARGV[1]}' /etc/passwd /etc/fstab

再次说明, awk 对输入文件中的每一行都执行这个脚本。

自定义变量

1)-v var=value 在选项中定义

示例:自定义变量,打印hello world

# awk -v var='hello world!' 'BEGIN{print var}'

2)在program中直接定义

数组

关联数组:array[index-expression]

index-expression:

1)可以使用任意字符,字符串要使用双引号;

2)如果某数组元素事先不存在,在引用时awk会自动创建此元素并将其值初始化为“空串”;若要判断数组中是否存在某元素,需要使用"index in array"格式进行;

delete array[index]:删除数组中的单个元素

delete array:删除整个数组

函数

内置函数

srand():生成随机数种子

rand():返回1和0之间的随机数(小数)

int():对数取整

length():返回指定字符串的长度

sub(r, s, [t]):以r表示的模式来查找t所表示的字符串所匹配的内容,并将其第一次出现的替换为s所指定的内容

gsub(r, s, [t]):以r表示的模式来查找t所表示的字符串所匹配的内容,并将其所有出现的替换为s所指定的内容

split(s, a, [r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中

自定义函数

function name ( parameter, parameter, ... ) {
statements
return expression
}

awk中的操作符

算术操作符:

  • +  -  *  /  ^  %
  • -x:整数转换为负数
  • +x:字符串转换为数值

赋值操作符:

  • =  +=   -=   /=   %=   ^=   ++   --

比较操作符:

  • >  <  >=  <=  !=  ==

模式匹配符:

  • ~:左侧的字符串是否能够被右侧的模式匹配
  • !~:左侧的字符串是否能够被右侧的模式不匹配

逻辑操作符:

  • && (并且)
  • ||    (或者)
  • !       (否)

 

posted @ 2018-05-16 20:07  琼兔  阅读(182)  评论(0编辑  收藏  举报