文章目录

  • 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表达式

赋值操作符

  • =最常使用的操作符(等号前后可以增加空格)

    1. var1 = "name"
    2. var2 = "hello" "world" 赋值多个运算符
    3. var3 = $1
  • 其他赋值运算符
    ++ , -- , +=, -=, *=, /=, %=, ^=

算数操作符

  • +, -, *, /, %, ^

系统变量(awk本身自定义的系统变量)

  • FSOFS系统变量,OFS表示输出的字段分隔符
    awk读取每一行的内容之前,都会先读取FSOFS表示的分隔符,输入时进行字段的提取,输出时根据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}'

  • NRFNR行数
    当输入为多个文件时,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规范 系统总结相关推荐

  1. 【拔刀吧少年】之shell编程规范与变量

    shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官"(`又称命令的组合`) 二.用 ...

  2. shell脚本详解(一)——Shell编程规范与变量

    详解Shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官" 二.用户的登录shell ...

  3. Shell脚本——Shell编程规范及变量

    Shell编程规范及变量 一.Shell脚本概述 1.1.1 Shell基本概念 1.1.2 Shell脚本应用场景 1.1.3 Shell作用--翻译官 二.shell编程规范 2.1 用户登录sh ...

  4. Shell 编程规范与变量

    文章目录 1 Shell 1.1 Shell 作用 2 Shell 脚本概述 2.1 Shell 脚本应用场景 3 编写 Shell 脚本 3.1 脚本的构成 3.2 编写脚本代码 3.2.1 注释有 ...

  5. Shell编程规范与变量(shell编程规范,执行脚本文件的四种方式,管道符号与重定向,shell变量的作用于类型)

    文章目录 Shell脚本概述 Shell脚本的概念 Shell的作用 Shell编程规范 重定向与管道 Shell脚本变量 自定义变量 特殊变量 Shell脚本概述 Shell Script ,She ...

  6. Shell编程规范与Shell中的管道符号(|)和重定向符号<、>、>>

    Shell脚本编程规范 Shell脚本的应用场景 Shell编程规范 1.Shell解释器程序的种类 2.编写一个简单的Shell脚本 3.执行脚本文件的方式 4.Shell环境中的:管道(|)与重定 ...

  7. Shell awk文本处理,shell脚本编写

    Shell awk文本处理,shell脚本编写 一:内容包含awk.变量.运算符.if多分支 <a>语法糖: awk [options] 'commands' files option - ...

  8. SHELL常见的系统变量解析

    SHELL常见的系统变量解析 : $0 当前脚本的名称 $n 当前脚本不能的 第n个参数,n=,1,2-10 $* 当前脚本的所有参数(不包括程序本身) $# 当前脚本的参数个数不包括程序本身() $ ...

  9. linux shell awk 语法

    引用:http://blog.csdn.net/weekly123/article/details/1465675 inux shell awk 语法     Awk 是一种非常好的语言,同时有一个非 ...

最新文章

  1. 36条网络安全术语盘点——Vecloud
  2. 服务器u盘安装linux6.7,制作linux系统U盘并使用U盘安装CentOS7.6系统
  3. junit可执行但控制层无法执行_Junit测试时ContextLoader.getCurrentWebApplicationContext()返回空值...
  4. 面向.NET开发人员的Dapr——俯瞰Dapr
  5. linux的驱动开发——交叉编译器
  6. 2021年中国企业直播研究及服务商品牌测评报告
  7. boost.asio基础篇 小白入门注解
  8. 【德国】德累斯顿工业大学 机器学习和图像分析研究助理/博士生 招生
  9. 机器学习梯度下降举例_举例说明:机器学习
  10. 编译easymule 1.1.5
  11. OpenLayers 6 实现仿Echarts风格的动态迁徙图/航班图
  12. 企业网站开发需要注意什么事项?
  13. nginx压缩静态文件
  14. BeanUtils深拷贝,浅拷贝
  15. pythonfor反向循环_Python for 循环语句
  16. fiddler证书生成ca证书命令及抓包配置
  17. metis 多线程图划分论文笔记
  18. Nginx配置虚拟主机三种方式
  19. Linux下定时备份文件
  20. JS扫雷小游戏(DOM (html+css+js))

热门文章

  1. 端口01 - 零基础入门学习汇编语言67
  2. Visual Studio 2008 到底有多强?漫画告诉你 !
  3. 用js 判断datagrid 中的 checkbox 是否被选中
  4. C++排序算法实现(更新中)
  5. linux 任务计划 权限设置,Linux系统 文件权限+计划任务+日志系统
  6. 银河1号是超级计算机吗,强国挑战答题答案:银河1号是我国第一台超级计算机,银河1号于____年研制完成。...
  7. android使用webview上传文件,Android项目中如何在webview页面中上传文件
  8. ue4 4.24启动无响应_UE4项目问题集合
  9. 学校计算机机房好处,浅谈学校计算机机房维护
  10. 计算机科学技术作文600,生活因科技而精彩作文600字