awk工作原理
awk/gawk实现下面功能:文本处理、输出格式化的文本报表、执行算术运算、执行字符串操作
格式:
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称为域标识,符号不同
文件中的每一行称为记录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表达式、固定字符串需要用""引起来,而变量和数值不需要
取ip地址例子
取磁盘挂载点及磁盘分区格式/etc/fstab
取分区利用率
文件host_list.log 如下格式,请提取”.xxx.com”前面的主机名部分并写入到回到该文件中
awk变量
内置变量:
FS:输入字符字段分隔符,默认空白字符,功能相当于-F
OFS:输出字段分隔符,默认空白字符
RS:输入记录record分隔符,指定输入时的换行符,默认\n换行符
ORS:输出记录分隔符,输出时用指定符号代替换行符
NF:字段数量
查看rpm包架构数量
NR:记录的编号
取IP地址
FNR:各文件分别计数,记录的编号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数,每一个参数:ARGV[0],......
自定义变量(区分字符大小写)
-v var=value 在program中定义
printf
格式化输出,格式 printf “format”, item1,item2,...
说明:必须制定format,不会自动换行,需要显示给出换行符\n format中需要分别为后面每个item指定格式符
格式符:
%c 显示ascii码
%d,%i 十进制整数
%e %E 显示科学计数法数值
%f 显示浮点数
%g %G以科学计数法显示浮点数值
%u 无符号整数
%s 显示字符串
%% 显示%号
修饰符
#[.#] 第一个数值控制先死的宽度,第二个表示小数点后的精度如 %3.1f
- 左对齐 如%-15s
+右对齐 如%+d
操作符
算术操作符
x+y x-y x*y x/y x%y +x将字符串转换为数值 -x转换为负数
字符串操作符:没有符号的操作符,字符串连接
赋值操作符
= += -= *= /= %= ^= ++ --
比较操作符
== >= <= > < !=
模式匹配符
~ 左边与右边是否匹配,包含关系 !~是否不匹配
逻辑操作符
与 $$ 或 || 非 !,取反
条件表达式(三目运算符)
条件?真执行语句:假执行语句
模式pattern
pattern:根据pattern条件,过滤匹配的行,再做处理,如果未指定,则处理每一行,需要用//括起来
关系表达式,结果为真才执行
行范围line ranges
不支持行号,但是可以使用NR间接指定行号;/pat1/,/pat2/ 不支持直接给出数字格式
BEGIN END模式
BEGIN{}:开始处理文本前执行一次
END{}:仅在执行文本处理后执行一次
条件判读语句if-else
语法
if(condition){statement;...}[else statement]
if(condition){statement;...}else if(condition2){statement}else if(condition3){statement3}....else{statementN}
switch语句
语法
switch(expression){case value1 or /reg/:statement1;case value2 or /reg2/:statement2;...;default:statment}
循环while
语法
while (condition) {statement;…}
条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用
循环do-while
语法
do {statement;…}while(condition) 无论真假,先执行一次
循环for
语法
for(expr1;expr2;expr3){statement;...}如for(variable assignment;condition;iteration process) {for-body}
特殊用法 for(var in array){for-body}
continue和break
continue中断本次循环 break 中断整个循环
格式 continue [N] break [N]
next
next可以提前结束对本行处理而直接进入下一行处理,针对的是awk的处理行循环;功能类似continue,但不能用continue
数组
awk的数组为关联数组
格式
array_name[index]
weekdays["mon"]="Monday"
注意:可使用任意字符串,但是字符串必须使用双引号括起来;如果某数组元素不存在,则引用时,会自动创建该元素并赋值空串;使用for(index in array)遍历数组
多维数组
[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():返回整数
字符串处理:
length([S]):返回指定字符串的长度
sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
split(s,array,[r]):以r为分隔符,需要双引号引用,切割字符串s,并将切割后的结果保存在所表示的array数组中,第一个索引值为1.....
system函数:可以awk中调用shell命令,空格是awk中的字符串连接付,如果systemn中需要使用awk中的变量可以使用空格分隔,或者说出来awk的变量外一律用“”引用起来
自定义函数
自定义函数格式
function name(parameter,parameter,...){
statements
return expression
}
awk脚本
将awk写成脚本,直接调用执行
向awk传递脚本参数
格式
awkfile var=value var2=value2... Inputfile
注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-v参数
标签:...,statements,56,文本处理,awk,分隔符,字符串,array From: https://blog.51cto.com/gavenlee/6003639