shell-awk

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
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值