shell编程之awk
awk 是 Linux 以及 UNIX 环境中现有的功能最强大的数据处理工具。简单地讲, awk 是一种处理文本数据的编程语言。awk 的设计使得它非常适合于处理由行和列组成的文本数据。而在 Linux 或者 UNIX 环境中,这种类型的数据是非常普遍的。除此之外, awk 还是一种编程语言环境,它提供了正则表达式的匹配,流程控制,运算符,表达式,变量以及函数等一系列的程序设计语言所具备的特性。它从C 语言中获取了一些优秀的思想。 awk 程序可以读取文本文件,对数据进行排序,对其中的数值执行计算以及生成报表等。
awk基本语法
awk 'BEGIN{ commands } pattern{ commands } END{ commands }' [INPUTFILE…]
awk支持三种语法
1.只有{ } ——所有行
2.有/正则/ { } ——
3.只有正则表达式 ——动作是打印匹配到行的所有内容
awk内置变量
awk -F: '{printf "%-30s %i\n",$1,$3}' /etc/passwd
练习
<4>输出当前系统上GID为0的用户的用户名
[root@localhost ~]# awk -F : '$4==0{print $1}' /etc/passwd
root
<5>输出当前系统上GID大于500的用户的用户名
[root@localhost ~]# awk -F : '$4>500{print $1}' /etc/passwd
<6>输出当前系统上的所有用户名和UID,以“ # # ”为分隔符
[root@localhost ~]# awk -F : 'OFS="# #"{print $1,$3}' /etc/passwd
<7>输出/etc/passwd文件中以“:”为分隔符的最后一段。
[root@localhost ~]# awk -F : '{print $NF}' /etc/passwd
<8>对/etc/passwd文件中输出的每一行计数
[root@localhost ~]# awk '{print NR,$0}' /etc/passwd
<9>对/etc/passwd、/etc/fstab文件中输出的每一行分别计数。
[root@localhost ~]# awk '{print FNR,$0}' /etc/passwd /etc/fstab
<10>自定义变量
[root@localhost ~]# awk -v var="Linux.com.cn" BEGIN'{print var}'
Linux.com.cn
<11>以printf格式输出用户名,UID、GID
[root@localhost ~]# awk -F: '{printf "%-15s %d %8i\n",$1,$3,$4}' /etc/passwd
<12>检测当前系统上所有用户,如果用户名为root输出:Admin
如果用户名不为root输出:Common User
[root@localhost ~]# awk -F: '{if ($1=="root") printf "%-15s: %s\n",
$1,"Admin";
else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd
<13> 统计当前系统上UID大于500的用户的个数
[root@localhost ~]# awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}'
/etc/passwd
<14>读取/etc/passwd文件中的每一行的每一个字段,输出每个字段中字符个数大于等于四的字段。
[root@localhost ~]# awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print
$i};
i++ }}' /etc/passwd
<15>使用do-while语句输出/etc/passwd中每一行中的前三个字段
[root@localhost ~]# awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
<16>使用for语句输出/etc/passwd中每一行中的前三个字段
[root@localhost ~]# awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
<17>统计/etc/passwd文件中各种shell的个数
[root@localhost ~]# 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
[root@localhost ~]# awk -F: '{if($3%2==1) next;{printf "%-15s%d\n",$1,$3}}'
/etc/passwd
<19> 统计当前系统上以tcp协议工作的各端口的状态数
[root@localhost ~]# netstat -ant | awk '/^tcp/ {++STATE[$NF]} END {for(a in
STATE) print a, STATE[a]}'
<20>输出/etc/passwd中的每一行以||||隔开,默认不换行
[root@localhost ~]# awk -F: 'BEGIN{ORS="||||"}{print $0}' /etc/passwd