GNU awk:
简介:awk是一个数据处理工具。它比较倾向于将一行分成多个“字段”来处理。所以,awk比较适合处理小型数据。
gawk – pattern scanning and processing language
实现原理:
基本用法:gawk [options] 'program' FILE
program:PATTERN{ACTION STATEMENTS}语句之间用分号分割
print,printf
选项:
-F:指明输入时用到的字段分隔符;
-v var=value:自定义变量;
如:
基本常用输出命令
-
print
-
格式:print item1,item2,…
-
逗号为分隔符
-
输出的各item可以为字符串,也可以为数值,当前记录的字段、变量或awk的表达式;
-
如省略item;则打印$0。
-
变量
-
内建变量
FS:input field seperator,默认空白字符。
OFS:output field seperator,默认空白字符。
RS:input record seperator,输入时的换行符。
ORS:output record seperator,输出时的换行符。
NF:number of field,字段数量。
NR:number of record,行数量。
FNR:分别计算各文件行数。
FILENAME:文件名。
ARGC:命令行参数的个数;
ARGV:数组,保存的是命令行所给定的各参数:
-
自定义变量
(1)-v var=value(变量名区分字符大小写)
(2)在program中直接定义
-
printf命令
-
格式化输出:printf FORMAT,item1,item2,…
-
FORMAT必须给出;
-
不会自动换行,需要给出换行控制符,\n
-
FORMAT中需要分别为后面的每个item指定一个格式化符号;
格式符:
%c:显示字符的ASCII码;
%d,%i:显示十进制证书;
%e,%E:科学计数法数值显示;
%f:显示为浮点数;
%g,%G:以科学计数法或浮点形式显示数值;
%s:显示字符串:
%u:无符号整数:
%%:显示%自身。
修饰符:
#[.#]:第一个数字控制显示的宽度;第二个数字控制小数的精度。
-:左对齐
+:显示数值的符号
-
操作符
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^= ++, —
比较操作符:
>, >=, <, <=, !=, ==
模式匹配符:
~:左边是否和右边匹配包含
!~:是否不匹配
逻辑操作符:&&,||,!
如显示系统账号与root账号
awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
函数调用: function_name(argu1, argu2, …)
条件表达式: selector?if-true-expression:if-false-expression
-
PATTERN:根据pattern条件,过滤匹配的行,再做处理
-
(1)如果未指定:空模式,匹配每一行
-
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
-
(3) relational expression: 关系表达式;结果有“真”有“假”;结果为“ 真”才会被处理;
真:结果为非0值,非空字符串
假:结果为空字符串
-
(4) line ranges:行范围 startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式
awk -F: '/^root/,/^nobody/{print $1}' /etc/passwd
awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
-
(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
如:开始结束
-
awk控制语句if-else
-
语法: if(condition) statement [else statement] if(condition1){statement1}else if(condition2) {statement 2}else{statement3}
-
使用场景:对awk取得的整行或某个字段做条件判断
awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
示例:
-
while循环
-
语法:while(condition) statement
-
条件“真”,进入循环;条件“假”,退出循环
-
使用场景: 对一行内的多个字段逐一类似处理时使用 对数组中的各元素逐一处理时使用
-
do-while循环
-
语法:do statement while(condition)
-
意义:无论真假,至少执行一次循环体
-
示例:做1+2+3+…+100
awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}'
-
for循环
-
语法:for(expr1;expr2;expr3) statement for(variable assignment;condition;iteration process) {forbody}
-
特殊用法:能够遍历数组中的元素; 语法:for(var in array) {for-body}
-
示例:awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
-
switch语句
-
语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
-
break和continue
-
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0){continue}sum+=i}print sum}‘
-
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==11){break}sum+=i}print sum}‘
-
break [n] n代表跳出第几轮循环
-
continue [n]
-
next 提前结束对本行处理而直接进入下一行处理(awk自身循环) awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
-
关联数组:array[index-expression]
-
index-expression:
-
(1) 可使用任意字符串;字符串要使用双引号括起来
-
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建 此元素,并将其值初始化为“空串”
-
(3)若要判断数组中是否存在某元素,要使用“index in array”格 式进行遍历
-
若要遍历数组中的每个元素,要使用for循环
-
for(var in array) {for-body}
-
注意:var会遍历array的每个索引
-
示例
原创文章,作者:502795641,如若转载,请注明出处:http://www.178linux.com/48351
评论列表(1条)
写的很好,每一个awk用法都有一个详细的示例,如果能有一部分的示例结果,可能会直观点哦。