awk:
主要是类unix系统下对文本或者数据处理的一种工具;一种编程语言。支持自己的函数还支持用户自定义的函数和正则表达式。
awk有两种模式:命令行模式 脚本模式
命令模式:
awk [options] 'commands' files
选项:
-F:自定义字段的分割符,默认的分割符是空格或者连续的空格
-v:定义变量
-f:指定awk的脚本文件
命令:
1、范围说明,正则表达式,awk的语句{语句1;语句2...}
2、awk语句需要用分号隔开
3、调用shell的变量需要用双引号引起来
字段的分割和变量:
1、
$0 文件本身
$1~$n:代表文件用分割符分割的第1~第n列(字段)
NF:文件当前记录的字段数(列数)
$NF:文件的最后一列
$(NF-1):
FNR/NR:行号
FILENAME 文件名
RS:换行符
"":打印字符串
\t:制表符
FS:指定分割符
print:打印
示例:
第1行:
root uid homedir shell
# awk -F: '{print "第"NR"行:" RS $1,$3,$(NF-1),$NF}' passwd1
1034 awk -F: '{print $NF}' passwd1
1035 awk -F: '{print $(NF-1)}' passwd1
1036 awk -F: '{print $1,$3,$(NF-1),$NF}' passwd1
1037 awk -F: '{print $1"deuidshi:"$3}' passwd1
1038 awk -F: '{print $1,"deuidshi:"$3}' passwd1
1039 awk -F: '{print $1,"deuidshi:",$3}' passwd1
1040 awk -F: '{print $1 "deuidshi:" $3}' passwd1
1041 awk -F: '{print $1,"deuidshi:",$3}' passwd1
1042 awk -F: '{print NF}' passwd1
1043 awk -F: '{print "第1行:"RS,$1,$3,$(NF-1),$NF}' passwd1
1044 awk -F: '{print "第"NR"行":"RS,$1,$3,$(NF-1),$NF}' passwd1
1045 awk -F: '{print "第"NR"行:""RS,$1,$3,$(NF-1),$NF}' passwd1
1046 awk -F: '{print "第"NR"行:" RS $1,$3,$(NF-1),$NF}' passwd1
1047 awk -F: '{print $0}' passwd1
1048 awk -F: '{print FILENAME}' passwd1
1) 范围
BEGIN{};{}
END
USERNAME HOME_DIR SHELL
root /root /bin/bash
...
# awk 'BEGIN{FS=":"};{print "USERNAME\tHOME_DIR\tSEHLL" RS $1"\t",$(NF-1)"\t",$NF}' passwd1
USERNAME HOME_DIR SHELL
**************************************
1056 awk -F: 'BEGIN{print "USERNAME\tHOME_DIR\tSEHLL" RS "**************************************"};{print $1"\t",$(NF-1)"\t",$NF}' passwd1
1061 for ((i=1;i<=5;i++));do echo $i;done|awk '{i+=$1};END{print i}'
1062 for ((i=1;i<=5;i++));do echo $i;done|awk '{a+=$1};END{print i}'
1063 for ((i=1;i<=5;i++));do echo $i;done|awk '{a+=$1};END{print a}'
1064 for ((i=1;i<=10;i+=2));do echo $i;done
1065 for ((i=1;i<=10;i+=2));do echo $i;done|awk '{a+=$1};END{print a}'
**************BEGIN******************
USERNAME HOME_DIR SHELL
...
**************END********************
# awk -F: 'BEGIN{print "**************BEGIN******************"}RS{print "USERNAME\tHOME_DIR\tSHELL" RS,$1"\t",$(NF-1)"\t",$NF};END{print"**************END********************"}' passwd1
2)正则表达式
== 等于
!= 不等于
>
<
>=
<=
~ 匹配于
!~ 不匹配
&&
||
1081 awk -F: '/root/{print $1}' passwd1
1082 awk -F: '/root/{print $1,$3,$NF}' passwd1
1083 awk -F: 'NR==1,NR==5{print $0}' passwd1
1084 awk -F: '/^root/,/^halt/{print $0}' passwd1
1085 awk -F: '/^adm/,NR==5{print $0}' passwd1
1086 cat -n passwd1
1087 awk -F: '/^adm/,NR==3{print $0}' passwd1
1088 awk -F: '/^root/||/^sync/{print $0}' passwd1
1089 awk -F: 'NR>=2 && NR<=8{print $0}' passwd1
1090 awk -F: '2<=NR<=8{print $0}' passwd1
1091 awk -F: 'NR==1,NR==10{print $0}' passwd1
1092 awk -F: 'NR==1 || NR==10{print $0}' passwd1
1093 awk -F: 'NR==1 && NR==10{print $0}' passwd1
1094 awk 'NR==1 && NR==10{print $0}' passwd1
1095 awk 'NR==1 || NR==10{print $0}' passwd1
# ifconfig eth0|awk 'NR==2{print $2}'|awk -F: '{print $2}'
课堂练习:
1、打印可以登录操作系统的用户的所有信息
# awk -F: '$7~/bash/{print $0}' passwd
# awk -F: '/bash$/{print $0}' passwd
# awk -F: '$0~/bash/{print $0}' passwd
# awk -F: 'BEGIN{print "*******BEGIN******"}$0 ~ /bash/{print $0};END{print "*********END*******"}' passwd
*****************BEGIN********************
*****************END**********************
2、打印出系统中可以登录系统的用户信息
# awk -F: 'BEGIN{print "USERNAME\tUID\tHOME_DIR\tSHELL" RS "****************"};$7~/bash/{print $1"\t"$3"\t"$(NF-1)"\t"$NF};END{print "***********"}' passwd
USERNAME UID HOME_DIR SHELL
*********************************************
*********************************************
3、找出文件中以数字开头
# awk '$0 ~ /^[0-9]/{print $0}'
# awk '/^[0-9]/{print $0}'
4、找出文件中以任意字母开头的
# awk '/^[a-Z]/{print $0}'
5、使用awk打印出自己的ip地址、子网掩码和广播地址
# ifconfig eth0|awk NR==2|awk -F '[ :]+' '{print $4RS$6RS$8}'
awk的循环控制:
if语句:
格式:
{if(表达式) {语句1;语句2;...}}
if [xxx];then
xxx
fi
# awk -F: '{if($3==0){print $1,"admin"}}'
# awk -F: '{if($3!=0){print $1,"not admin"}}' passwd1
{if(表达式) {语句1;语句2;...}else{语句1;语句2;...}}
# awk -F: '{if ($3==0){print $1,"is administrator"}else{print $1,"is other user"}}'
# awk -F: '{if($3==0){count++}else{i++}};END{print "管理员个数:" count;print "其他用户的个数:" i}'
if [xx];then
xxxx
else
xxx
fi
{if(表达式1){语句1;..}else if(表达式2){语句1;..}else{语句1;...}}
if [xxx];then
xxx
elif [xxx];then
xxx
else
fi
# awk -F: '{if($3==0){print $1,"是管理员"}else if($3<500 || $3==65534){print $1,"是系统用户"}else{print $1,"是普通用户"}}'
# awk -F: '{if($3==0){i++}else if($3>=500 && $3!=65534){j++}else{x++}}END{print "管理员的个数为:"i;print "系统用户的个数为:"x;print "普通用户的个数为:" j}'
for循环:
1166 for ((i=1;i<=5;i++));do echo $i;done
1167 awk 'BEGIN{for(i=1;i<=5;i++) print i}'
1168 awk 'BEGIN{for(i=1;i<=10;i++) print i}'
1169 awk 'BEGIN{for(i=1;i<=10;i+=2) print i}'
1170 awk 'BEGIN{for(i=1;i<=10;i+=2) print i}'|awk '{a+=$1};END{print a}'
# awk 'BEGIN{for(i=0;i<=50;i+=2) print i}'|awk '{sum+=$1};END{print sum}'
while循环:
# awk 'BEGIN{i=1;while(i<=5){print i;i++}}'
# awk 'BEGIN{i=0;while(i<=10){print i;i+=2}}'
# awk 'BEGIN{i=0;while(i<=10){print i;i+=2}}'|awk '{sum+=$1}END{print sum}'
break:条件满足时中断循环
continue:条件满足时跳过循环
# awk 'BEGIN{i=0;while(i<=4){i++;if(i==3) continue;print i}}'
1
2
4
5
# awk 'BEGIN{i=0;while(i<=4){i++;if(i==3) break;print i}}'
1
2
脚本模式:
1、命令列表
2、引用shell变量需要用双引号
3、#注释
xxx.awk
#!/bin/awk
NR==1,NR==10/{print $0}
/^root/||/^ftp/{print $0}
awk -f xxx.awk filename
awk [options] xxx.awk filename
作业1:
写一个自动检测磁盘使用率的脚本,当磁盘使用率达到90%以上时,发邮件给管理员root
作业2:
写一个自动监控系统内存和交换分区使用情况的脚本;当交换分区的剩余空间小于总空间的30%时,提示留意交换分区,否则显示在正常范围
判断IP地址是否合法:
0.x.x.x
x.x.x.0
x.x.x.255
a.x.x.x
shell-awk
最新推荐文章于 2023-12-03 18:44:29 发布