RHCE
- 一、概念
- 二、工作流程
- 1、如图
- 2、流程
- 三、awk程序执行方式
- 1、通过命令行执行awk程序
- 2、awk命令调用脚本执行
- 3、直接使用awk脚本文件调用
- 四、awk命令的基本语法
- 1、格式
- 2、BEGIN模式与END模式
- 3、awk的输出
- 五、记录和域
- 1、概念
- 2、示例
- 3、使用-F参数指定域之间的间隔符
- 4、使用系统内置变量FS改变域分隔符
- 5、NR、NF、FILENAME变量
- 六、awk的变量
- 1、概念
- 2、内置变量
- 3、示例
- 4、用户自定义变量
- 七、awk操作符
- 1、算术运算符
- 2、赋值运算符
- 3、条件运算符
- 4、逻辑运算符
- 5、关系运算符
- 6、其它运算符
- 八、awk的模式
- 1、关系表达式
- 2、正则表达式
- 3、混合模式
- 4、BEGIN模式与END模式
- 九、awk控制语句
- 1、if语句
- 2、fox循环
- 3、while循环
- 4、break、continue语句
- 5、next语句
- 6、exit
- 十、格式化输出
- 1、格式
- 2、format
- 3、注意
- 4、示例
- 十一、awk数组
- 1、索引数组
- 2、关联数组
- 3、循环遍历数组
- 4、利用数组统计字符串出现次数
- 十二、实战
一、概念
-
awk是Linux以及UNIX环境中现有的功能最强大的数据处理工具,awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母
-
awk是一种处理文本数据的编程语言,适合文本处理和报表生成,awk的设计使得它非常适合于处理由行和列组成的文本数据。
-
awk 还是一种编程语言环境,它提供了正则表达式的匹配,流程控制,运算符,表达式,变量以及函数等一系列的程序设计语言所具备的特性,它从C语言中获取了一些优秀的思想
二、工作流程
1、如图
2、流程
- 第一步:自动从指定的数据文件中读取行文本。
- 第二步:自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量$1、$2等等
- 第三步:依次执行程序中所有的匹配模式及其操作
- 第四步:当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有为读取的数据行,则返回到第(1)步,重复执行(1)~(4)的操作。
三、awk程序执行方式
1、通过命令行执行awk程序
- 任何awk语句都由模式(
pattern
)和动作(action
)组成- 模式:由一组用于测试输入行是否需要执行动作的规则
- 动作:包含语句,函数和表达式的执行过程
- 简言之,模式决定动作何时触发和触发事件,动作执行对输入行的处理
[root@server ~]# vim input # 输入多个回车
[root@server ~]# awk '/^$/{print "This is a blank line."}' input
2、awk命令调用脚本执行
- 在awk程序语句比较多的情况下,用户可以将所有的语句写在一个脚本文件中,然后通过awk命令来解释并执行其中的语句。awk调用脚本的语法如下
awk -f program-file file
-
-f选项表示从脚本文件中读取awk程序语句,program-file表示awk脚本文件名称,file表示要处理的数据文件
-
例
[root@server ~]# vim scr.awk # 输入以下内容
/^$/{print "This is a blank line."}
[root@server ~]# awk -f scr.awk input # 使用命令及脚本结合的方法执行
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
3、直接使用awk脚本文件调用
- 在上面介绍的两种方式中,用户都需要输入awk命令才能执行程序。除此之外,用户还可以通过类似于Shell脚本的方式来执行awk程序。在这种方式中,需要在awk程序中指定命令解释器,并且赋予脚本文件的可执行权限。其中指定命令解释器的语法如下
#!/bin/awk -f
- 以上语句必须位于脚本文件的第一行
- 通过以下命令执行awk程序:
./awk-script.awk file
- 例:
[root@server ~]# vim awktest.awk
#!/bin/awk -f # 注意:awk脚本解释器
/^$/{print "This is a blank line."}
[root@server ~]# chmod +x awktest.awk # 赋予执行权限
[root@server ~]# ./awktest.awk input # 执行awk脚本后跟上被处理的文件名
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
四、awk命令的基本语法
1、格式
awk 'BEGIN{ commands } pattern{ commands } END{ commands }' [INPUTFILE…]
# 以上三部分可选
2、BEGIN模式与END模式
-
BEGIN模式是一种特殊的内置模式,其执行的时机为awk程序刚开始执行,但是又尚未读取任何数据之前。因此,该模式所对应的操作仅仅被执行一次,当awk读取数据之后,BEGIN模式便不再成立。所以,用户可以将与数据文件无关,而且在整个程序的生命周期中,只需执行1次的代码放在BEGIN模式对应的操作中,一般用于打印报告的标题和更改内在变量的值
-
END模式是awk的另外一种特殊模式,该模式执行的时机与BEGIN模式恰好相反,它是在awk命令处理完所有的数据,即将退出程序时成立,在此之前,END模式并不成立。无论数据文件中包含多少行数据,在整个程序的生命周期中,该模式所对应的操作只被执行1次。因此,一般情况下,用户可以将许多善后工作放在END模式对应的操作中EN,一般用于打印总结性的描述或数值总和
-
例
[root@server ~]# awk 'BEGIN{print "BEGIN...."} {print $0} END{print "The End"}' /etc/fstab
3、awk的输出
- 格式:
awk 'BEGIN{ commands } {print item1,item2,……} END{ commands }' [INPUTFILE…]
- 各项目之间使用逗号隔开,而输出到屏幕时则以空格字符分隔
- 输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,然后再输出;
五、记录和域
1、概念
- awk认为输入文件是结构化的,awk将每个输入文件行定义为记录,行中的每个字符串定义为域,域之间用空格,Tab键或其他符号进行分隔,分隔域的符号就叫做分隔符,默认为空格或tab
- awk定义域操作符
$
来指定执行动作的域,域操作符$
后面跟数字或变量来标识域的位置,每条记录的域从1开始编号,如$1
表示第一个域$0
表示所有域
2、示例
# 准备示例文件
[root@server ~]# vim awk1.txt
Li xiaoming xian 13311111111
zhang cunhua bapji 133222222222
wang xiaoer xianyang 13333333333
[root@server ~]# awk '{print $0}' awk1.txt # 打印所有列(域)
Li xiaoming xian 13311111111
zhang cunhua bapji 133222222222
wang xiaoer xianyang 13333333333
[root@server ~]# awk '{print $1}' awk1.txt
Li
zhang
wang
[root@server ~]# awk '{print $2}' awk1.txt
xiaoming
cunhua
xiaoer
[root@server ~]# awk '{print $3}' awk1.txt
xian
bapji
xianyang
[root@server ~]# awk '{print $4}' awk1.txt
13311111111
133222222222
13333333333
[root@server ~]# awk 'BEGIN{one=1;two=2} {print $(one+two)}' awk1.txt
xian
bapji
xianyang
# 查看本机IP
[root@server ~]# ip a | grep ens160 | awk '/inet/{print $2}'
# 查看内存剩余容量
[root@server ~]# free -m | awk '/Mem/{print $4}'
# 查看开机挂载设备的文件系统
[root@server ~]# awk '/^[^#]/{print $3}' /etc/fstab
# 查看hosts文件的IP地址
[root@server ~]# awk '{print $1}' /etc/hosts
3、使用-F参数指定域之间的间隔符
# 语法: awk -F "符号" '/模式/{动作}' 文件名
# 查看本机所有账户的名称及UID
[root@server ~]# awk -F ":" '{print $1,$3}' /etc/passwd
4、使用系统内置变量FS改变域分隔符
# 语法:awk 'BEGIN {FS="符号"} /模式/{动作}' 文件名
[root@server ~]# awk 'BEGIN{print $FS}'
# 输出账户的UID、GID
[root@server ~]# awk 'BEGIN{FS=":"} {print $3,$4}' /etc/passwd
5、NR、NF、FILENAME变量
- 概念
- NR变量:表示记录数,即行数、行号
- NF变量:表述·处理的域(列)数量
- FILENAME变量:被处理的文件名
- 示例
[root@server ~]# awk '{print NF,NR,$0} END{print FILENAME}' awk1.txt
4 1 Li xiaoming xian 13311111111
4 2 zhang cunhua bapji 133222222222
4 3 wang xiaoer xianyang 13333333333
awk1.txt
[root@server ~]# awk '{print "第",NR,"行","有",NF,"列" > "/root/t1.txt"}' awk1.txt
[root@server ~]# cat t1.txt
第 1 行 有 4 列
第 2 行 有 4 列
第 3 行 有 4 列
六、awk的变量
1、概念
-
与其他的程序设计语言一样,awk本身支持变量的相关操作,包括变量的定义和引用,以及参与相关的运算等。此外,还包含了许多内置的系统变量
-
变量的作用是用来存储数据。变量由变量名和值两部分组成,其中变量名是用来实现变量值的引用的途径,而变量值则是内存空间中存储的用户数据
-
awk的变量名只能包括字母、数字和下划线,并且不能以数字开头。例如abc、a_、_z以及a123都是合法的变量名,而123abc则是非法的变量名。另外,awk的变量名是区分大小写的,因此,X和x分别表示不同的变量
-
awk中的变量类型分为两种,分别为字符串和数值。但是在定义awk变量时,毋需指定变量类型,awk会根据变量所处的环境自动判断。如果没有指定值,数值类型的变量的缺省值为0,字符串类型的变量的缺省值为空串
2、内置变量
变量 | 作用 |
---|---|
$0 | 记录变量,表示所有域 |
$n | 字段变量,表示第n个域 |
NF | 当前记录的域个数 |
NR | 显示每一行的行号 |
FS | 输入字段分隔符,默认值是空格或者制表符,可使用-F指定分隔符 |
OFS | 输出字段分隔符 ,OFS=”#”指定输出分割符为# |
RS | 记录分隔符,默认值是换行符 \n |
ENVIRON | 当前shell环境变量及其值的关联数组 |
3、示例
- 准备示例文件
[root@server ~]# vim awk2.txt
zhangsan 68 88 92 45 71
lisi 77 99 63 52 84
wangwu 61 80 93 77 81
- 例1
[root@server ~]# vim test.awk
{printprint "$0:",$0print "$1:",$1print "$2:",$2print "NF:",NFprint "NR:",NRprint "FILENAME:",FILENAME
}
# 使用awk命令调用脚本执行
[root@server ~]# awk -f test.awk awk2.txt
zhangsan 68 88 92 45 71
$0: zhangsan 68 88 92 45 71
$1: zhangsan
$2: 68
NF: 6
NR: 1
FILENAME: awk2.txt
lisi 77 99 63 52 84
$0: lisi 77 99 63 52 84
$1: lisi
$2: 77
NF: 6
NR: 2
FILENAME: awk2.txt
wangwu 61 80 93 77 81
$0: wangwu 61 80 93 77 81
$1: wangwu
$2: 61
NF: 6
NR: 3
FILENAME: awk2.txt
- 例2
[root@server ~]# awk -F ":" 'BEGIN{OFS="\t"} {print $1,$2}' /etc/passwd
- 例3:
# 面试题:打印/etc/sos/sos.conf中所有的空白行的行号
[root@server ~]# awk '/^$/{print NR}' /etc/sos/sos.conf
4、用户自定义变量
-
awk允许用户自定义自己的变量以便在程序代码中使用
-
变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头
-
awk变量名称区分字符大小写
-
例
[root@server ~]# awk 'BEGIN{test="hello world" ; print test}' # 变量定义在BEGIN中
hello world
[root@server ~]# awk -v test="hello world" BEGIN'{ print test}' # 变量定义在-V参数后
hello world
七、awk操作符
- awk是一种编程语言环境,因此,它也支持常用的运算符以及表达式,例如算术运算、逻辑运算以及关系运算等
1、算术运算符
+ - * / % ^(指数) **(指数)
- 示例
[root@server ~]# awk 'BEGIN{x=2;y=3;print x+y,x-y,x*y,x/y,x^y,x**y}'
5 -1 6 0.666667 8 8
# 面试题:统计某目录下的文件占用存储空间字节数
[root@server ~]# ll /root | awk 'BEGIN{size=0} {size=size+$5} END{print size/1024,"KB"}'
2、赋值运算符
- 符号
= += /= *= %= ^=
- 示例
[root@server ~]# awk 'BEGIN{a=5;a+=5;print a}'
10
[root@server ~]# awk 'BEGIN{a=5;a*=3+2;print a}'
25
3、条件运算符
- 格式
条件表达式?表达式1:表达式2
-
条件运算符是一个三目运算符,条表成立,则表达式1为最终结果否则表达式2为最终结果
-
例
[root@server ~]# vim awk2.txt
zhangsan 68 88
lisi 77 99
wangwu 61 80
[root@server ~]# awk '{max=$2>$3?$2:$3 ; print NR,"max=",max}' awk2.txt
1 max= 88
2 max= 99
3 max= 80
4、逻辑运算符
- 符号
&& || !
5、关系运算符
- 符号:
> < >= <= == != ~(匹配) !~(不匹配)
- 示例
# 查询/etc/passwd文件中第三列小于10以下的信息,仅列出账户与uid
[root@server ~]# awk -F ":" '$3<10{print $1 , $3}' /etc/passwd
# 查看ip地址
[root@server ~]# ifconfig ens160 | awk 'NR==2{print $2}'
6、其它运算符
++ -- + - 等
[root@server ~]# awk 'BEGIN{a=0 ; print a++ , ++a }'
0 2
# 注意:awk变量为字符串变量时参与了算术操作,其值自动转为数值0
[root@server ~]# awk 'BEGIN{a="china" ; print a++ , ++a }'
0 2
[root@server ~]# awk 'BEGIN{a="ABABABAB" ; print a++ , ++a }'
0 2
[root@server ~]# awk '{++count ; print $0} END{print "账户数:" , count}' /etc/passwd
# 注意:count未赋初值参与算术运算时数值自动转为0
八、awk的模式
- awk支持关系表达式、正则表达式、混合模式、BEGIN模式、END模式等
1、关系表达式
- 新建示例文件
[root@server ~]# vim awk3.txt
liming 85
wangwei 99
zhangsan 68
- 例
[root@server ~]# awk '$2>80{print }' awk3.txt
2、正则表达式
- 与sed一样awk的正则表达式必须放置在两个/之间(/正则表达式/)
[root@server ~]# awk '/^l/{print}' awk3.txt
liming 85
[root@server ~]# awk '/^l|z/{print}' awk3.txt
liming 85
zhangsan 68
[root@server ~]#
[root@server ~]# awk '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3、混合模式
- awk支持关系表达式或正则表达式,还支持逻辑运算符&&、|| 、!组成的混合表达式
[root@server ~]# awk '/^l/ && $2 > 80 {print}' awk3.txt
liming 85
4、BEGIN模式与END模式
九、awk控制语句
1、if语句
- 格式:与C语言类似
if (expression)
{语句1语句2……
}
else
{语句3语句4……
}
- 示例
[root@server ~]# vim if.awk
#!/bin/awk -f
{if($2>=90){print "优秀"} else{if($2>=80){print "良好"}else{if($2>=60){print "及格"} else{print "补考"} } }
}
[root@server ~]# chmod +x if.awk
[root@server ~]# ./if.awk awk3.txt
良好
优秀
及格
[root@server ~]# cat awk3.txt
liming 85
wangwei 99
zhangsan 68
# 输出UID小于GID的账户名
[root@server ~]# awk 'BEGIN{FS=":"} {if($3<$4) print $1}' /etc/passwd
adm
lp
mail
games
ftp
# UID为奇数的账户名
[root@server ~]# awk 'BEGIN{FS=":"} {if($3%2==1) print $1}' /etc/passwd
# UID为偶数,但小于20的账户名
[root@server ~]# awk 'BEGIN{FS=":"} {if($3%2==0 && $3<20) print $1}' /etc/passwd
# uid包含9的账户名
[root@server ~]# awk 'BEGIN{FS=":"} {if($3~9) print $1}' /etc/passwd
# 面试题:
1.查询cpu占用率大于指定数值的信息
[root@server ~]# ps -eo user,pid,pcpu,comm | awk '{if($3>0) print}'
2.统计系统账户数(UID小于1000的为系统账户,其它为普通账户)
[root@server ~]# awk -F ":" '{if($3<1000) {x++} else {y++}} END{print "系统账户数:",x,"\n","普通账户数:",y}' /etc/passwd
系统账户数: 35 普通账户数: 2
2、fox循环
-
格式与c语言格式相同
-
例
[root@server ~]# awk 'BEGIN{for(i=1;i<=100;i++) {sum=sum+i} ; print "sum=",sum}'
sum= 5050
3、while循环
- 格式1
while(expression)
{循环语句1循环语句2……
}
- 格式2
do{循环语句1循环语句2……
}while(expression)
- 例
[root@server ~]# awk 'BEGIN{while(i<=100) {sum+=i ; i++} ; print "sum=",sum}'
sum= 5050
4、break、continue语句
5、next语句
- next语句并不是用在循环结构中,而是用于awk整个执行过程中,当awk程序执行时,若遇到next语句则提前结束本行处理,会继续读取下一行
[root@server ~]# awk -F ":" '{if($3%2==0) next ; print $1}' /etc/passwd
6、exit
- 作用:终止awk程序执行
十、格式化输出
1、格式
-
与c语言格式相同
-
printf("format\n",输出列表项)
2、format
- format是一种控制输出格式的字符串,以%开头,后跟上一个字符,如:
%c:字符
%d,%i:十进制整数
%u:无符号整数
%f:浮点数
%e,%E:科学计数法
%s:字符串
%%:显示一个%
- format说明符有修饰符
N:数字
-:左对齐
+:显示数值符号
3、注意
- printf语句不会打印\n
- 字符串一般使用双引号作为定界符
4、示例
[root@server ~]# awk 'BEGIN{printf("%d,%c\n","A",97)}'
0,a
[root@server ~]# awk 'BEGIN{printf("%5d\n",12345)}'
12345
[root@server ~]# awk 'BEGIN{printf("%2d\n",12345)}'
12345
[root@server ~]# awk 'BEGIN{printf("%5d\n",12)}'12
[root@server ~]# awk 'BEGIN{printf("%-5d\n",12)}'
12
[root@server ~]# awk 'BEGIN{printf("%10.2f\n",123.4567)}'123.46
[root@server ~]# awk 'BEGIN{printf("%5.2f\n",123.4567)}'
123.46
[root@server ~]# awk 'BEGIN{printf("%.2f\n",123.4567)}'
123.46
[root@server ~]# awk 'BEGIN{printf("%E\n",123.4567)}'
1.234567E+02
[root@server ~]# awk -F ":" '{printf("%-20s%d\n",$1,$3)}' /etc/passwd
# 面试题:计算本机内存的占用率%
[root@server ~]# free | awk 'NR==2{printf("内存利用率:%%%.2f\n",($3/$2)*100)}'
十一、awk数组
1、索引数组
-
索引数组以数字作为下标
-
通过数组的下标(索引)引用数组中所有元素,下标一般从0开始
-
例:
[root@server ~]# awk 'BEGIN{a[0]="a" ; a[1]="b" ; a[2]="c" ; a[3]="d" ; print a[0],a[1],a[2],a[3]}'
a b c d
- awk数组中元素若为空串,是合法的,注意:空串不是空
[root@server ~]# awk 'BEGIN{a[0]="a" ; a[1]="" ; a[2]="c" ; a[3]="d" ; print a[0],a[1],a[2],a[3]}'
a c d
- 当一个元素不存在于数组时,此时若引用该数值,awk会自动创建该元素,值为空串
[root@server ~]# awk 'BEGIN{a[0]="a" ; a[1]="b" ; a[2]="c" ; a[3]="d" ; print a[0],a[1],a[2],a[3],a[4]}'
a b c d
2、关联数组
- 原则:数组的索引以字符串作为下标
[root@server ~]# awk 'BEGIN{a["zero"]="a" ; a["one"]="b" ; a["two"]="c" ; a["three"]="d" ; print a["zero"],a["one"],a["two"],a["three"]}'
a b c d
- 注意:
- awk数组本质是一种使用字符串作为下标的关联数组
- awk数组中的数字下标最终会转为字符串
3、循环遍历数组
- 格式1
for(初始化;条件表达式;步长)
{循环体语句
}
- 格式2
for(变量 in 数组)
{循环体语句
}
- 例1:利用for循环变量i与数组下标都是数字的这一特征,按顺序输出数组元素
[root@server ~]# awk 'BEGIN{a[0]="a";a[1]="b";a[2]="c";a[3]="d"; for(i=0;i<4;i++) {print i,a[i]}}'
0 a
1 b
2 c
3 d
- 例2:数组中下标为字符串,且无规律则使用for循环的in方式访问,输出内容为无序状态
[root@server ~]# awk 'BEGIN{a["zero"]="a" ; a["one"]="b" ; a["two"]="c" ; a["three"]="d" ; for(i in a) {print i,a[i]}}'
three d
two c
zero a
one b
- 注意:awk数组本质是一种“关联数组”,默认打印的顺序是无序的,例1中时借助for循环中循环变量i的值实现输出有序的,由于i的值是数值并递增的,且刚好与数组下标相等,则使得使用数值作为数组下标时,for循环访问是按一定顺序的。
4、利用数组统计字符串出现次数
- awk中可以利用数值进行运算,如:
[root@server ~]# awk 'BEGIN{a=1;print ++a}'
2
- 变量值为字符串的自增运算
[root@server ~]# awk 'BEGIN{a="test" ; print a,++a}'
test 1
- 注意
- awk中字符串参与算术运算时会被当做数值0
- 当引用一个不存在的数组元素时,该元素被赋值为空字符串,若该空字符串参与算术运算会被当做数值0
- 例1:统计文本中IP出现次数
# 准备文本
[root@server ~]# vim iptest.txt
192.168.48.1
192.168.48.2
192.168.48.5
192.168.48.1
192.168.48.3
192.168.48.1
192.168.48.5
192.168.48.2
192.168.48.4
192.168.48.1
[root@server ~]# awk '{count[$1]++} END{ for(i in count) {print i,"次数:",count[i]}}' iptest.txt
192.168.48.1 次数: 4
192.168.48.2 次数: 2
192.168.48.3 次数: 1
192.168.48.4 次数: 1
192.168.48.5 次数: 2
-
分析
- 创建一个count数组,并将文件中ip地址行作为元素的下标,所以执行第一行时,引用的数组为count[“192.168.48.1”]
- count[“192.168.48.1”]++相当于存储的数据为0并自增1
- 继续下一行处理,运算过程同上
- 当再次遇到192.168.48.1IP地址时,会使用上一次的数组存储数据参与自增运算
- 直到所有行遍历结束,执行END模式完成打印
-
例2:查看服务器连接状态并汇总
[root@server ~]# netstat -an | awk '/^tcp/{++s[$NF]} END{for(i in s) {print i,s[i]}}'
LISTEN 8
ESTABLISHED 2
- 分析
- netstat -an:查看连接
- /^tcp/ : 通过正则过滤
- $NF:过滤结果的第6行
十二、实战
<1>输出当前系统所有用户的UID:
# awk –F :’{print $3}’ /etc/passwd
注释:-F :指定分隔符为:$3指定第三段
<2>输出当前系统所有用户的UID,在首行加入UserUid:
# awk -F : 'BEGIN{print "UserUid"}{print $3}' /etc/passwd
<3>输出当前系统shell为/bin/bash的用户名,在最后一行加入END That is last line!!!
# awk -F : /bash$/'{print $1}END{print "END That is last line!!!"}'
/etc/passwd
<4>输出当前系统上GID为0的用户的用户名
# awk -F : '$4==0{print $1}' /etc/passwd
<5>输出当前系统上GID大于500的用户的用户名
# awk -F : '$4>500{print $1}' /etc/passwd
<6>输出当前系统上的所有用户名和UID,以“ # # ”为分隔符
# awk -F: 'OFS=" # # "{print $1,$3}' /etc/passwd
<7>输出/etc/passwd文件中以“:”为分隔符的最后一段。
# awk -F: '{print $NF}' /etc/passwd
<8>对/etc/passwd文件中输出的每一行计数
# awk '{print NR,$0}' /etc/passwd
<9>对/etc/passwd、/etc/fstab文件中输出的每一行分别计数。
# awk '{print FNR,$0}' /etc/passwd /etc/fstab
<10>自定义变量
# awk -v var="Linux.com.cn" BEGIN'{print var}'
<11>以printf格式输出用户名,UID、GID
# awk -F: '{printf "%-15s %d %8i\n",$1,$3,$4}' /etc/passwd
<12>检测当前系统上所有用户,如果用户名为root输出:Admin
如果用户名不为root输出:Common User
# awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf
"%-15s: %s\n", $1, "Common User"}' /etc/passwd
<13> 统计当前系统上UID大于500的用户的个数
# awk -F: -v sum=0 '{if ($3>=500) sum++} END{print sum}' /etc/passwd
<14>读取/etc/passwd文件中的每一行的每一个字段,输出每个字段中字符个数大于等于四的字段。
# awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}'
/etc/passwd
<15>使用do-while语句输出/etc/passwd中每一行中的前三个字段
# awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
<16>使用for语句输出/etc/passwd中每一行中的前三个字段
# awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
<17>统计/etc/passwd文件中各种shell的个数
# awk -F: '$NF!~/^$/{BASHsum[$NF]++}END{for(A in BASHsum){printf
"%-15s:%i\n",A,BASHsum[A]}}' /etc/passwd
注释:$NF!~/^$/:最后一个字段非空BASHsum[$NF]++:最后一个字段相同的加一
<18> 显示当前系统上UID号为偶数的用户名和UID
# awk -F: '{if($3%2==1) next;{printf "%-15s%d\n",$1,$3}}' /etc/passwd
<19> 统计当前系统上以tcp协议工作的各端口的状态数
# netstat -ant | awk '/^tcp/ {++STATE[$NF]} END {for(a in STATE) print a,
STATE[a]}'
<20>输出/etc/passwd中的每一行以||||隔开,默认不换行
# awk -F: 'BEGIN{ORS="||||"}{print $0}' /etc/passwd