2021-01-10

本文详细介绍了AWK命令,包括BEGIN和END模块、工作过程、变量(自定义和内置)、控制语句(if、while、for)、数组操作(定义、赋值、遍历、删除)及应用范例。还介绍了cut命令,最后给出一个系统管理脚本示例,可实现磁盘、内存、CPU等信息查看。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

awk中的BEGIN和END
语法:
awk [options] ‘BEGIN{ print “start” } 匹配规则{ commands } END{ print “end” }’ filename
其中:BEGIN END是AWK的关键字,因此必须大写;这两个部分开始块和结束块是可选的
BEGIN模块:BEGIN 的执行时机是"在 awk 程序一开始,尚未读取任何数据之前"。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据时,BEGIN 的条件就不再成立,所以BEGIN定义的动作只能被执行一次。通过BEGIN开始块我们可以用来设置变量,设置标题。
例如:

#这里定义了两个动作
#第一个动作使用BEGIN条件,所以会在读入文件数据前打印"print username and loginshell" (只会执行一次)
#第二个动作会在条件满足时打印文件的第1个字段和第7个字段
END模块:END也是awk的保留字,不过刚好和 BEGIN 相反。END 是在 awk 程序处理完所有数据,即将结束时执行的。END 后的动作只在程序结束时执行一次。
例如:
输出结尾输入"The End",这并不是文档本身的内容,而且只会执行一次

AWK工作过程:

通过上面我们可以知道;AWK它工作过程
将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。
3、把当前输入记录与awk中’匹配规则{执行命令}'中的“匹配规则”比较,看是否匹配,如果相匹配,就执行对应的‘执行命令’。如果不匹配,就跳过对应的执行命令。
4、awk读取输入的下一行,继续重复步骤2和3,这个过程一直持续,直到awk读取到文件尾。
awk的变量
awk自定义变量
自定义变量:用户自己定义的变量,有两种形式
1、-v varname=value 变量名区分字符大小写
3、也可以引用命令行定义的变量

注:之前的{}里都是只有一个print语句,其实print只是一个语句,而{}可以有多个语句,以;号隔开。
awk内置变量(预定义变量)
awk除了可以自定义变量外,awk还提供一些内置量,常用的内置标量如下:
$n 当前记录(当前行)的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段
$0 这个变量包含执行过程中当前行的文本内容
FILENAME 当前输入文件的名
FS 字段分隔符(默认是任何空格)
NF 表示字段数,在执行过程中对应于当前的字段数
NR 表示记录数,在执行过程中对应于当前的行号
FNR 各文件分别计数的行号

如何显示最后两列的值呢?
分析:NF变量表示每行字段数,所以NF的值就是每行最后一个字段,NF减1就是倒数第二个字段。

例3:FNR:awk支持多文件扫描,如果采用NR, 下一个文件的行序号会接着上一个文件,FNR就会单独统计

例4:FS:分隔符
范例1:分隔符的使用
用法:-F fs 其中fs是指定输入分隔符,fs可以是字符串或正则表达式;分隔符默认是空格
常见的写法: -F: -F, -F[aA]

实例演示
awk范例

-w 可直接匹配这个单词
范例2:关系运算符的使用
范例5:统计当前内存的使用率

说明:printf命令与print命令类似,用于显示输出的,只不过printf命令可以按照指定的格式显示输出。
printf命令格式:printf “打印格式” 显示内容
其中:%2.f就是打印格式,表保留小数后两位,f代表浮点数
awk控制语句
if语句
if (条件) print
if(条件){print}else{print}
if(条件){print}else if(条件){print}else{print}
说明: -F"[ %]+"表示将空格或%当做分隔符。
if语句使用的地方===》对awk来说,要对取得的整行或某个字段做条件判断
while循环
语句:while(条件){语句} 如果条件为“真”进入循环,条件为“假”退出循环
在进行运算结果统计时,可以使用符号+=,意思是说我们可以把增加的结果赋值给符号的左边的变量,对哪个域操作就把哪个域写在符号的右边,如Total+=KaTeX parse error: Expected 'EOF', got '#' at position 26: …ot@localhost ~]#̲ cat b.txt 20 1…i;i++}; print total}’ b.txt
34
59
57
说明:while语句使用的地方===》在awk中对一行内容中的多个字段一个个处理。
for循环
语法:for(变量赋值;条件;迭代){命令}
[root@localhost ~]# awk ‘{total=0;for(i=1;i<=NF;i++){total+=$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)
它经常用来统计某个东西出现的次数,可以这样表示:
2.5.7.1、范例1:统计Listen和Estableshed出现的次数

范例2:统计相同的网站出现的次数
测试文件:
[root@localhost ~]# cat c.txt
http://www.163.com
http://www.163.com
http://www.163.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.cnblogs.com
http://www.qq.com
http://www.163.com
http://www.baidu.com
http://www.baidu.com
http://www.qq.com
http://www.163.com
http://www.baidu.com
[root@localhost mnt]# awk -F"[/]+" ‘{print $2}’ c.txt | sort
www.163.com
www.163.com
www.163.com
www.baidu.com
www.baidu.com
www.baidu.com
www.baidu.com
www.cnblogs.com
www.qq.com
[root@localhost mnt]# awk -F"[/]+" ‘{print $2}’ c.txt |sort|uniq -c
5 www.163.com
7 www.baidu.com
1 www.cnblogs.com
2 www.qq.com
注:
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、付费专栏及课程。

余额充值