awk

awk简介

awk在unix时候已经出现了。在linux上跑的,很多都是gun版的awk,简称gawk,以下简称awk
awk提供的不是编辑器命令,而是提供了一种编程语言,能够像其他编程语言一样,定义变量保存数据,使用算术和字符串操作符、逻辑判断、数组、循环等各种编程语言中所有可以使用的功能

awk的基本语法格式

awk [OPTION] 'program' FILE
'program'组成:pattern{action STATEMENTS}

action statements可以由多句语句组成,个语句之间使用;号隔开,理解awk的语法组成尤为重要。

awk的处理过程

awk在处理文本时,也是一次读取一行文本,然后根据输入分隔符(默认空格)进行切片,切成n片后,然后将每片都赋予awk内部的一个变量当中来进行保存。这些变量分别用$1、$2...一直到分片的最后一个,awk能对这些分片单独处理。如输出显示、运算、计数等。

awk常见选项

-F fs:指明字段分隔符;
-v var=value:自定义变量;
-f programfile:从文件中读取program命令;

awk常用的action

1.print()
其使用格式类似于print item1,item2,...,使用逗号作为分隔符,输出的item可以为字符串,也可以为数值,也可以为当前记录的字段、变量或表达式等。如果省略了item,则相当于print $0打印所有行。
2.printf()
printf命令常用于格式化输出awk命令的执行结果信息。其格式类似于printf FORMAT,item1,item2...,其中必须指定FORMAT格式;如需换行,需手动添加\n换行符;在FORMAT中需要分别为后面的每个item指定一个格式符。
其对应的格式符有:

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

awk的program语句

program部分由两pattern{action STATEMENTS} 组成,其中,pattern表示awk要匹配的行,后面的{}则表示对这些行作如何处理。
parrent格式

  1. empty:空模式,默认就是空模式,表示处理所有行。
    例如:awk -F:'{print($1,$7)}' /etc/passwd表示以:为分割,打印每行的$1和$7分片的内容

  2. /regular expression/:表示只处理被expression所匹配到的行,匹配不上的不会被处理。
    例如awk -F: '/\/bin\/bash$/{print($1)}' /etc/passwd,表示在处理前,匹配结尾是否为/bin/bash,如果是,则套用在{}输出显示。

  3. /PATTERN1/,/PATTERN2/:表示仅处理从第一个被pattern1匹配到行,到第一个被pattern2所匹配的行之间的所有行.

  4. relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;
    例如:awk -F: '$3%2==0{print $1,$3}' /etc/passwd,表示如果UID为偶数,则显示用户名和ID

  1. line range:注意,不支持直接给出行范围,但可以通过内置NR变量来取行范围。
    例如:awk -F: 'NR>=1&&NR<=10{print $1,$3}' /etc/passwd
    只对1到10行作处理。
  1. BEGIN{}:表示对文本处理前,应先执行的语句

  2. END{}:对文本处理完成后,会执行END{}语句.

awk变量

1.内建变量
awk在内部有内建的变量,常用变量如下。

FS:输入字段分隔符,默认为空白字符;
OFS:输出字段分隔符,默认为空白字符;
RS:输入时的换行符;
ORS:输出时的换行符;
NF:每行的字段数,$NF表示最后一个字段;
NR:表示行数;
FNR:若提供多个文件,则分别计算各文件的行数;
FILENAME:当前文件名;
ARGC:命令行参数的个数;
ARGV:参数数组,保存的是命令行给定的各参数;

2.自建变量
变量可以使用选项-v来指明。
例如:awk -v admin=123 'BEGIN{print admin}'
也可以在program中自定义变量。
例如: awk 'BEGIN{test=123;print(test)}'
注意,引用变量不需要加$号,$号是用做代表分片变量。

awk的条件表达式

action

)Expressions: 算术,比较表达式等
) Control statements :if, while等
) Compound statements :组合语句
) input statements
) output statements :print等

** Control statements(控制语句)
控制语句 ,注意看格式
if(condition) {statments}
if(condition) {statments} else {statements}
while(conditon) {statments}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }

无论如何,注意语法格式,

  1. if-else
    语法:if(condition) {statments} else {statements}
    例:判断UID,少于500,判断为系统用户,大于1000,普通用户
    [root@test ~]# awk -F: '{if ($3<500) {print ("systemUser",$1,$3)} else {print("comm user",$1,$3)}}' /etc/passwd

2.if-else if 多重分支
语法:if(condition) {statments} else if(condition) {statements}
例:判断UID,等于0,显示管理员,大于0少于500,显示系统用户,其余显示为普通用户
[root@test1 ~]# awk -F : '{if ($3 == 0) {print ($1,"adminuser")} else if ($3 >= 1 && $3 < 500) {print ($1,"sysuser")} else {print ($1,"commuser")}}' /etc/passwd

3.while循环
条件为真,则进入循环,直到条件为假退出
使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用
语法:while(conditon) {statments}
例子:对/etc/grub.conf的非#号开头的行的其他行,计算其每个单词的长度
[root@test1 ~]# awk '!/^#/{i=1;while(i<=NF) {print ($i,length($i));i++}}' /etc/grub.conf

4.do-while循环
语法:do statement while(condition)
意义:至少执行一次循环体

5.for循环
语法:for(expr1;expr2;expr3) statement
for(variable assignment;condition;iteration process) {for-body}
例子:对/etc/grub.conf的非#号开头的行的其他行,计算其每个单词的长度
[root@test1 ~]# awk '{for(i=1;i<=NF;i++) print ($i,length($i))}' /etc/grub.conf

你可能感兴趣的:(awk)