shell --- awk规范 系统总结
文章目录
- awk和sed的区别
- awk脚本的流程控制
- awk 记录和字段
- 字段的引用
- awk表达式
- 赋值操作符
- 算数操作符
- 系统变量(awk本身自定义的系统变量)
- 关系操作符
- 布尔操作符
- awk 条件和循环
- 条件语句
- 循环
- awk 的数组
- 数组的定义
- 数组的遍历
- 删除数组
- 举例,编写awk脚本文件`avg.awk`
- 命令行参数数组
- 复杂数组的使用案例
- awk函数
- 算数函数
- 字符串函数
- 自定义函数
awk和sed的区别
- awk更像是脚本语言
- awk用于“比较规范”的文本处理,用于统计数量并输出指定字段
- 使用sed 将不规范的文本,处理为“比较规范的文本”
awk脚本的流程控制
- 输入数据前 例程 BEGIN{},相当于预处理,进行变量定义
- 主输入循环{} ,一般只写主输入循环
- 所有文件读取完成 例程END{}
awk 记录和字段
- 每一行称为 akw记录
- 使用空格、制表符分隔开的单词称为字段
- 可以自己指定分隔的字段
字段的引用
awk中使用$1,$2,$3…$n表示每隔字段
awk '{print $1,$2,$3}' filename
awk 可以使用-F选项改变字段分隔符
awk -F, '{print $1, $2, $3}' filename
分隔符可以使用正则表达式
使用单引号作为分隔符,读取以menu
开头的字段使用x++,可以打印行号
awk表达式
赋值操作符
=
最常使用的操作符(等号前后可以增加空格)var1 = "name"
var2 = "hello" "world"
赋值多个运算符var3 = $1
- 其他赋值运算符
++ , -- , +=, -=, *=, /=, %=, ^=
算数操作符
+, -, *, /, %, ^
系统变量(awk本身自定义的系统变量)
FS
和OFS
系统变量,OFS
表示输出的字段分隔符
awk读取每一行的内容之前,都会先读取FS
和OFS
表示的分隔符,输入时进行字段的提取,输出时根据OFS增加分隔符
举例如下:
head -5 /etc/passwd | awk -F ":" '{print $1}'
使用-F来分隔就等价于
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1}'
,通过BEGIN
读入之前,设置好字段分隔符。
增加OFS
输出字段分隔符
RS
记录分隔符,行之间的合并
将每一行的记录分隔符\n
设置为:
,则每当遇到:
,即代表一行
head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}'
NR
和FNR
行数
当输入为多个文件时,FNR
可以重排多个文件,FR
则都按照一个文件的行号排列
NF
字段数量,最后一个字段内容可以用$NF
取出字段内容
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}'
,输出每一行的字段个数
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}'
,输出最后一个字段的内容
关系操作符
<, >, <=, >=, ==, !=, ~, !~
布尔操作符
&&, ||, !
awk 条件和循环
条件语句
- 条件语句使用
if
开头,根据表达式结果判断执行哪一条语句if(表达式)awk 语句1 [elseawk 语句2 ]
- 如果有多个语句需要执行,可以使用{}将多个语句括起来
循环
while
循环while (表达式)awk 语句1
do
循环do{awk 语句1 }while(表达式)
for
循环for(初始值;循环判断条件;累加)awk 语句1
使用for进行求和,并取平均值
cat kpi.txt | awk '{sum=0;for(c=2;c<=NF;++c) sum+=$c;print sum/(NF-1)}'
- 影响控制的其他语句
break
continue
awk 的数组
主要为了对awk进行多行关联,多行之间进行通信
数组的定义
数组:一组有某种关联的数据(变量),通过下标依次访问
数组名[下标]=值
下标可以使用数字,也可以使用字符串。
PS:即使使用的是数字,awk也会将其当作字符串或者字符来处理
数组的遍历
for (变量 in 数组名)
#使用 数组名[变量] 的方式依次对每个数组的元素进行操作
删除数组
delete 数组[下标]
举例,编写awk脚本文件avg.awk
awk '{sum=0;\for(c=2;c<=NF;++c)\sum+=$c;\avg[$1]=sum/(NF-1)}\END{\for(user in avg)sum2+=avg[user];print sum2/NR}' \
kpi.txt
加载awk脚本文件
awk -f avg.awk kpi.txt
命令行参数数组
命令行参数数组:ARGC
参数个数 和ARGV
代表的参数内容
主要用来辅助awk的脚本使用
编辑arg.awk
BEGIN{for(x = 0;x < ARGC;x ++)print ARGV[x] #打印每个参数内容print ARGC #打印参数个数
}
执行命令awk -f arg.awk 11 22 33
输出如下:
awk #第0个参数,命令名称
11
22
33
4 #总共四个参数(当前命令也会被记录进去)
复杂数组的使用案例
编辑result.awk
,用来进行总分,平均分、高于且低于平均分人数统计、分数评级、各个级别人数统计,该数据记录在kpi.txt
{sum = 0
for(c = 2; c <= NF; c++)sum += $cavg[$1] = sum / (NF - 1)if(avg[$1] >= 80) #统计每个人的评级level = "S"
else if(avg[$1] >=70)level = "A"
else if(avg[$1] >= 60)level = "B"
else level = "C"print $1,avg[$1],levelletter_all[level] ++ #关联数组,统计各个评级的人数
}
END {for(usr in avg)sum2 += avg[usr]avg_all = sum2 / NR #所有人的平均成绩
print "avg_all is :",avg_allfor(usr in avg) #计算超过以及小于平均成绩的人数if(avg[usr] >= avg_all)up++elsedown++print "biger than avg_all",up
print "less than avg_all",downprint "S:",letter_all["S"]
print "A:",letter_all["A"]
print "B:",letter_all["B"]
print "C:",letter_all["C"]
}
运行awk -f result.awk kpi.txt
其中kpi.txt
内容如下:
user1 72 56 83 91
user2 55 67 45 89
user3 90 87 85 83
user4 56 57 99 95
user5 55 60 64 32
最终输出如下:
user1 75.5 A
user2 64 B
user3 86.25 S
user4 76.75 A
user5 52.75 C
avg_all is : 71.05
biger than avg_all 3
less than avg_all 2
S: 1
A: 2
B: 1
C: 1
awk函数
算数函数
sin()
和cos()
int()
awk 'BEGIN{pi=3.14;print int(pi)}'
rand()
伪随机数 和srand()
重新获取种子 0-1之间
awk 'BEGIN{srand();print rand()}'
字符串函数
gsub(r,s,t)
字符串替换sub(r,s,t)
字符串替换substr(r,s,t)
字符串替换split(s,a,sep)
字符串分割match(s,r)
字符串匹配length(s)
字符串长度index(s,t)
通过man awk
搜索函数名称,可以看到具体函数的功能以及详细用法
自定义函数
函数定义的位置,写在 BEGIN
,{}
,END
之外
function 函数名(参数){awk 语句return awk 变量
}
举例如下:
awk 'function a(){ return 0 } BEGIN{print a()}'
awk 'function twice(str) { return str str} BEGIN{print twice("hello awk")}'
shell --- awk规范 系统总结相关推荐
- 【拔刀吧少年】之shell编程规范与变量
shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官"(`又称命令的组合`) 二.用 ...
- shell脚本详解(一)——Shell编程规范与变量
详解Shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官" 二.用户的登录shell ...
- Shell脚本——Shell编程规范及变量
Shell编程规范及变量 一.Shell脚本概述 1.1.1 Shell基本概念 1.1.2 Shell脚本应用场景 1.1.3 Shell作用--翻译官 二.shell编程规范 2.1 用户登录sh ...
- Shell 编程规范与变量
文章目录 1 Shell 1.1 Shell 作用 2 Shell 脚本概述 2.1 Shell 脚本应用场景 3 编写 Shell 脚本 3.1 脚本的构成 3.2 编写脚本代码 3.2.1 注释有 ...
- Shell编程规范与变量(shell编程规范,执行脚本文件的四种方式,管道符号与重定向,shell变量的作用于类型)
文章目录 Shell脚本概述 Shell脚本的概念 Shell的作用 Shell编程规范 重定向与管道 Shell脚本变量 自定义变量 特殊变量 Shell脚本概述 Shell Script ,She ...
- Shell编程规范与Shell中的管道符号(|)和重定向符号<、>、>>
Shell脚本编程规范 Shell脚本的应用场景 Shell编程规范 1.Shell解释器程序的种类 2.编写一个简单的Shell脚本 3.执行脚本文件的方式 4.Shell环境中的:管道(|)与重定 ...
- Shell awk文本处理,shell脚本编写
Shell awk文本处理,shell脚本编写 一:内容包含awk.变量.运算符.if多分支 <a>语法糖: awk [options] 'commands' files option - ...
- SHELL常见的系统变量解析
SHELL常见的系统变量解析 : $0 当前脚本的名称 $n 当前脚本不能的 第n个参数,n=,1,2-10 $* 当前脚本的所有参数(不包括程序本身) $# 当前脚本的参数个数不包括程序本身() $ ...
- linux shell awk 语法
引用:http://blog.csdn.net/weekly123/article/details/1465675 inux shell awk 语法 Awk 是一种非常好的语言,同时有一个非 ...
最新文章
- 36条网络安全术语盘点——Vecloud
- 服务器u盘安装linux6.7,制作linux系统U盘并使用U盘安装CentOS7.6系统
- junit可执行但控制层无法执行_Junit测试时ContextLoader.getCurrentWebApplicationContext()返回空值...
- 面向.NET开发人员的Dapr——俯瞰Dapr
- linux的驱动开发——交叉编译器
- 2021年中国企业直播研究及服务商品牌测评报告
- boost.asio基础篇 小白入门注解
- 【德国】德累斯顿工业大学 机器学习和图像分析研究助理/博士生 招生
- 机器学习梯度下降举例_举例说明:机器学习
- 编译easymule 1.1.5
- OpenLayers 6 实现仿Echarts风格的动态迁徙图/航班图
- 企业网站开发需要注意什么事项?
- nginx压缩静态文件
- BeanUtils深拷贝,浅拷贝
- pythonfor反向循环_Python for 循环语句
- fiddler证书生成ca证书命令及抓包配置
- metis 多线程图划分论文笔记
- Nginx配置虚拟主机三种方式
- Linux下定时备份文件
- JS扫雷小游戏(DOM (html+css+js))
热门文章
- 端口01 - 零基础入门学习汇编语言67
- Visual Studio 2008 到底有多强?漫画告诉你 !
- 用js 判断datagrid 中的 checkbox 是否被选中
- C++排序算法实现(更新中)
- linux 任务计划 权限设置,Linux系统 文件权限+计划任务+日志系统
- 银河1号是超级计算机吗,强国挑战答题答案:银河1号是我国第一台超级计算机,银河1号于____年研制完成。...
- android使用webview上传文件,Android项目中如何在webview页面中上传文件
- ue4 4.24启动无响应_UE4项目问题集合
- 学校计算机机房好处,浅谈学校计算机机房维护
- 计算机科学技术作文600,生活因科技而精彩作文600字