shell

AWK工作过程:

1.如果BEGIN块存在,awk执行它指定的actions。
2.awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取),awk将读入的记录分割成多个字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。
3、把当前输入记录与awk中’匹配规则{执行命令}'中的“匹配规则”比较,看是否匹配,如果相匹配,就执行对应的‘执行命令’。如果不匹配,就跳过对应的执行命令。
4、awk读取输入的下一行,继续重复步骤2和3,这个过程一直持续,直到awk读取到文件尾。
5、当awk读完所有的输入行后,如果存在END,就执行相应的actions、
例如:显示最近登录系统的用户,要求只显示用户名和登录源
使用last命令可以查看最近登录的用户信息。如下图所示:

使用awk命令抽取用户名和IP区域的数据

awk的变量
awk自定义变量
自定义变量:用户自己定义的变量,有两种形式
1、-v varname=value 变量名区分字符大小写
例如:统计用户数量:

2、在program中直接定义,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号。
3、也可以引用命令行定义的变量

awk内置变量(预定义变量)
awk除了可以自定义变量外,awk还提供一些内置量,常用的内置标量如下:
$n 当前记录(当前行)的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段
$0 这个变量包含执行过程中当前行的文本内容
FILENAME 当前输入文件的名
FS 字段分隔符(默认是任何空格)
NF 表示字段数,在执行过程中对应于当前的字段数
NR 表示记录数,在执行过程中对应于当前的行号
FNR 各文件分别计数的行号
实例演示
awk范例
范例1:提取网卡的IP地址
范例2:关系运算符的使用
范例3:打印passwd文件中用户UID小于10的用户名和它登录使用的shell
[root@localhost ~] # awk -F: ‘$3<10{print 1 " < = = = = = > " 1"<=====>" 1"<=====>"NF}’ /etc/passwd
awk控制语句
if语句
if (条件) print
if(条件){print}else{print}
if(条件){print}else if(条件){print}else{print}
范例1:
[root@localhost ~]# awk -F: ‘{if($3<1000) {print “system_user=”$1} else {print “program_user=”$1}}’ /etc/passwd
范例2:统计分区使用率,输出超过15%的分区信息
[root@localhost ~]# df -hT | awk -F"[ %]+" ‘/^/dev/ {if($6>15)print $1,$6"%"}’

说明: -F"[ %]+"表示将空格或%当做分隔符。
if语句使用的地方===》对awk来说,要对取得的整行或某个字段做条件判断
while循环
语句:while(条件){语句} 如果条件为“真”进入循环,条件为“假”退出循环
在进行运算结果统计时,可以使用符号+=,意思是说我们可以把增加的结果赋值给符号的左边的变量,对哪个域操作就把哪个域写在符号的右边,如Total+=KaTeX parse error: Expected 'EOF', got '#' at position 50: …ot@localhost ~]#̲ awk '{total=0;…i}; print total}’ b.txt
34
59
57
特殊作用:它能够用来遍历数组中的元素
语法:for (var in array){语句}
偶数(next)
打印奇数或偶数行
[root@localhost ~]# awk 'NR%20{print NR,$0}’ /root/score.txt
2 马茵茵 女 上海 文科 85 94 70 249 83.00
4 刘婷婷 女 广州 理科 83 88 81 252 84.00
6 余小灵 男 天津 理科 93 90 87 270 90.00
数组
定义
数组是一个包含一系列元素的集合。
格式如下:
abc[1]=”xiaohong”
abc[2]=”xiaolan”
解释:
abc :为数组名称
[1]、[2]:为数组元素下标,可以理解为数组的第1个元素、数组的第2个元素
”xiaohong”、”xiaolan”: 元素内容
数组变量赋值的格式
var[index]=element
说明:var
==>是数组名
index===>是关联数组的下标
element===>是数组的元素值
数字做数组下标:
array[1]=”sun”
array[2]=”kai”
字符串做数组下标:
array[“first”]=”www”
array[“last”]=”name”
我们在引用数组变量的时候,必须要包含它的下标值,然后通过下标值来提取它相对应的元素值
[root@localhost ~]# awk 'BEGIN{

test[“a”]=“Mon”
test[“b”]=“Tue”
test[“c”]=“Wor”
print test[“b”]
}’
显示结果:
Tue
也可以写成:

awk ‘BEGIN{test[“a”]=“Mon”;test[“b”]=“Tue”;test[“c”]=“Wed”;print test[“b”]}’

遍历数组中的元素
若要遍历数组中的每个元素,可以使用for循环:
for(var in array){print array[var]}
说明: for循环在每次循环时会将数组array的一个下标值赋给变量var,然后去执行大括号中的语句。还有一个需要注意的地方就是这个变量var中存储的是下标值而不是数组的元素值。我们可以把这个变量当作是数组的下标,然后来提取出对应元素值
[root@localhost ~]# awk 'BEGIN{

test[“a”]=“Mon”
test[“b”]=“Tue”
for(i in test)
{print "Index:“i,”-----value:"test[i]}
}’
Index:a -----value:Mon
Index:b -----value:Tue
删除数组元素
[root@localhost ~]# awk ‘BEGIN{test[1]=“a”;test[2]=“b”;for(i in test){print "Index:“i,”=====value:"test[i]}; delete test[2];print “---------”;for(i in test){print "Index:“i,”=====value:"test[i]}}’
Index:1 =====value:a
Index:2 =====value:b


Index:1 =====value:a
数组应用范例
array[“index”]++ 每循环一次这个索引所对应的元素值加1(初始值默认是0)
它经常用来统计某个东西出现的次数,可以这样表示:
1.1.1.1、范例1:统计Listen和Estableshed出现的次数

sort命令用于将文本文件内容加以排序
uniq命令用于检查及删除文本文件中重复出现的行列,一般与sort命令结合使用
也可以通过下面的操作统计每个网站出现的次数:
[root@localhost ~]# awk -F"[/]+" ‘{times[$2]++}END{for(i in times){print i,times[i]}}’ c.txt
www.qq.com 2
www.cnblogs.com 1
www.baidu.com 7
www.163.com 5
cut命令
定义
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。
主要参数
-d :自定义分隔符,默认为制表符。
-f  :与-d一起使用,指定显示哪个区域。
范例1:
[root@localhost ~]# awk -F: ‘{print $NF}’ /etc/passwd
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
[root@localhost ~]# cut -d: -f7 /etc/passwd
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
脚本综合
系统管理工具
需求
类似++++系统管理工具箱++++++
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
写法:
[root@localhost ~]# cat system.sh
#!/bin/bash
menu(){
cat<<eof
++++系统管理工具箱++++++
h 显示命令帮助
f 显示磁盘使用情况
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
eof
}
#显示文件系统的磁盘使用情况统计
Fdisk(){
df -Th
}
#显示硬盘容量、已使用容量、空闲容量
Diskinfo(){
df -Th|awk ‘/^/dev/{print $1"\t\t"$3"\t\t\t"$4"\t\t\t"$5}’
}
#查看内存占用前10进程
Memtop10(){
ps aux --sort -pmem | head -11 | awk ‘{print $1"\t"$2"\t"$4"\t"$11}’
}
#查看CPU占用前10进程
Cputop10(){
ps aux --sort -pcpu|head -11|awk ‘{print $1"\t"$2"\t"$3"\t"$11}’
}
#显示帮助信息
menu
while true
do
read -p “input a choose(h for help):” OP
case $OP in
h)
clear
menu;;
f)
echo “显示文件系统的磁盘使用情况统计”
Fdisk;;
d)
echo “显示硬盘容量、已使用容量、空闲容量”
Diskinfo;;
m)
echo “内存占用前10进程”
Memtop10;;
u)
echo “CPU占用前10进程”
Cputop10;;
q)
exit;;
*)
echo “输入错误”
esac
done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值