awk工作原理

awk/gawk实现下面功能:文本处理、输出格式化的文本报表、执行算术运算、执行字符串操作

56、文本处理工具-awk_条件判断

格式:

awk [option] 'program' var=value file...
awk [option] -f programfile var=value file...

说明:program通常放到单引号中,又以下三部分组成:BEGIN语句块 模式匹配通用语句块 END语句块

常用选项:
-F "分隔符" 指明输入时用到的分隔符,默认分隔符是若干个连续空白符
-v var=value 变量赋值

program格式
patterm{action statements;...} pattern:触发语句,如BEGIN(开始处理文本前执行一次)、END(文本处理后执行一次)、正则等
action statements:对数据进行处理,放在{}内指明,常见print,printf

分隔符、域和记录

分隔符:由分隔符分隔的字段(列column 域filed)标记$1(第一列) $2 $n称为域标识,56、文本处理工具-awk_awk_02符号不同

文件中的每一行称为记录record  默认变量NR

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

常用action分类

output statements:print printf

expressions:算术,比较表达式等

compound statements:组合语句

control statements:if while语句等

input statements

awk控制语句

{statements;...}组合语句

if(condition){statements;...}

if(condition){statements;...}else{statements;...}

while(condition){statements;...}

do{statements;...}while{condition}

for(expr1;expr2;expr3){statements;...}

break

continue

exit

动作print

格式 print item1, item2, ...

说明:逗号分隔符,输出item可以字符串,也可以是数值;当前记录的字段、变量或awk表达式、固定字符串需要用""引起来,而变量和数值不需要

56、文本处理工具-awk_awk_03

56、文本处理工具-awk_条件判断_04

取ip地址例子

56、文本处理工具-awk_条件判断_05

取磁盘挂载点及磁盘分区格式/etc/fstab

56、文本处理工具-awk_awk_06

56、文本处理工具-awk_awk_07

取分区利用率

56、文本处理工具-awk_条件判断_08

文件host_list.log 如下格式,请提取”.xxx.com”前面的主机名部分并写入到回到该文件中

56、文本处理工具-awk_awk_09

awk变量

内置变量:

FS:输入字符字段分隔符,默认空白字符,功能相当于-F

56、文本处理工具-awk_条件判断_10

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

56、文本处理工具-awk_循环_11

RS:输入记录record分隔符,指定输入时的换行符,默认\n换行符

56、文本处理工具-awk_函数_12

ORS:输出记录分隔符,输出时用指定符号代替换行符

56、文本处理工具-awk_awk_13

NF:字段数量

56、文本处理工具-awk_循环_14

56、文本处理工具-awk_函数_15

查看rpm包架构数量

56、文本处理工具-awk_awk_16

NR:记录的编号

56、文本处理工具-awk_函数_17

56、文本处理工具-awk_awk_18

取IP地址

56、文本处理工具-awk_函数_19

FNR:各文件分别计数,记录的编号

56、文本处理工具-awk_循环_20

FILENAME:当前文件名

56、文本处理工具-awk_条件判断_21

ARGC:命令行参数的个数

56、文本处理工具-awk_函数_22

ARGV:数组,保存的是命令行所给定的各参数,每一个参数:ARGV[0],......

56、文本处理工具-awk_循环_23

自定义变量(区分字符大小写)

-v var=value 在program中定义

56、文本处理工具-awk_条件判断_24

56、文本处理工具-awk_条件判断_25

56、文本处理工具-awk_awk_26

printf

格式化输出,格式 printf “format”, item1,item2,...

说明:必须制定format,不会自动换行,需要显示给出换行符\n  format中需要分别为后面每个item指定格式符

格式符:
%c 显示ascii码
%d,%i 十进制整数
%e %E 显示科学计数法数值
%f 显示浮点数
%g %G以科学计数法显示浮点数值
%u 无符号整数
%s 显示字符串
%% 显示%号

修饰符
#[.#] 第一个数值控制先死的宽度,第二个表示小数点后的精度如 %3.1f
- 左对齐 如%-15s
+右对齐 如%+d

56、文本处理工具-awk_循环_27

56、文本处理工具-awk_条件判断_28

操作符

算术操作符

x+y  x-y x*y x/y x%y   +x将字符串转换为数值  -x转换为负数

字符串操作符:没有符号的操作符,字符串连接

赋值操作符

=  +=  -=  *= /= %= ^=  ++  --

56、文本处理工具-awk_循环_29

56、文本处理工具-awk_awk_30

56、文本处理工具-awk_条件判断_31

56、文本处理工具-awk_条件判断_32

比较操作符

==  >=    <=     >   <         !=

56、文本处理工具-awk_函数_33

56、文本处理工具-awk_循环_34

模式匹配符 

~ 左边与右边是否匹配,包含关系  !~是否不匹配

56、文本处理工具-awk_循环_35

56、文本处理工具-awk_函数_36

逻辑操作符

与 $$    或 ||    非 !,取反

56、文本处理工具-awk_awk_37

条件表达式(三目运算符)

条件?真执行语句:假执行语句

56、文本处理工具-awk_awk_38

56、文本处理工具-awk_条件判断_39

模式pattern

pattern:根据pattern条件,过滤匹配的行,再做处理,如果未指定,则处理每一行,需要用//括起来

56、文本处理工具-awk_函数_40

关系表达式,结果为真才执行

56、文本处理工具-awk_awk_41

56、文本处理工具-awk_awk_42

行范围line ranges

不支持行号,但是可以使用NR间接指定行号;/pat1/,/pat2/ 不支持直接给出数字格式

56、文本处理工具-awk_函数_43

56、文本处理工具-awk_函数_44

BEGIN END模式

BEGIN{}:开始处理文本前执行一次

END{}:仅在执行文本处理后执行一次

56、文本处理工具-awk_条件判断_45

条件判读语句if-else

语法

if(condition){statement;...}[else statement]
if(condition){statement;...}else if(condition2){statement}else if(condition3){statement3}....else{statementN}

56、文本处理工具-awk_条件判断_46

56、文本处理工具-awk_循环_47

switch语句

语法

switch(expression){case value1 or /reg/:statement1;case value2 or /reg2/:statement2;...;default:statment}
循环while

语法

while (condition) {statement;…}
条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用

56、文本处理工具-awk_条件判断_48

56、文本处理工具-awk_条件判断_49

循环do-while

语法

do {statement;…}while(condition) 无论真假,先执行一次

56、文本处理工具-awk_循环_50

循环for

语法

for(expr1;expr2;expr3){statement;...}如for(variable assignment;condition;iteration process) {for-body}
特殊用法 for(var in array){for-body}

56、文本处理工具-awk_函数_51

56、文本处理工具-awk_函数_52

continue和break

continue中断本次循环   break 中断整个循环

格式  continue [N] break [N]

next

next可以提前结束对本行处理而直接进入下一行处理,针对的是awk的处理行循环;功能类似continue,但不能用continue

56、文本处理工具-awk_awk_53

数组

awk的数组为关联数组

格式

array_name[index]
weekdays["mon"]="Monday"
注意:可使用任意字符串,但是字符串必须使用双引号括起来;如果某数组元素不存在,则引用时,会自动创建该元素并赋值空串;使用for(index in array)遍历数组

56、文本处理工具-awk_循环_54

56、文本处理工具-awk_awk_55

56、文本处理工具-awk_awk_56

多维数组

[root@centos8 ~]#awk 'BEGIN{
> array[1][1]=11
> array[1][2]=12
> array[1][3]=13
> array[2][1]=21
> array[2][2]=22
> array[2][3]=23
> for (i in array)
> for (j in array[i])
> print array[i][j]
> }'
11
12
13
21
22
23
awk函数

常见内置函数

数值处理:rand()返回0和1之间随机数  srand():配合rand()生成随机数的种子  int():返回整数

56、文本处理工具-awk_awk_57

56、文本处理工具-awk_条件判断_58

字符串处理:

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

sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s;gsub表示搜索所有内容进行匹配

56、文本处理工具-awk_条件判断_59

split(s,array,[r]):以r为分隔符,需要双引号引用,切割字符串s,并将切割后的结果保存在所表示的array数组中,第一个索引值为1.....

56、文本处理工具-awk_awk_60

56、文本处理工具-awk_awk_61

system函数:可以awk中调用shell命令,空格是awk中的字符串连接付,如果systemn中需要使用awk中的变量可以使用空格分隔,或者说出来awk的变量外一律用“”引用起来

56、文本处理工具-awk_awk_62

自定义函数

自定义函数格式

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

56、文本处理工具-awk_条件判断_63

awk脚本

将awk写成脚本,直接调用执行

56、文本处理工具-awk_条件判断_64

56、文本处理工具-awk_awk_65

56、文本处理工具-awk_函数_66

向awk传递脚本参数

格式
awkfile var=value var2=value2... Inputfile

56、文本处理工具-awk_条件判断_67

56、文本处理工具-awk_函数_68

注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-v参数