当前位置: 首页 > 编程日记 > 正文

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

赋值操作符

  • =最常使用的操作符(等号前后可以增加空格)
    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")}'

相关文章:

java初始化实例化_Java对象的创建过程:类的初始化与实例化

一、Java对象创建时机我们知道&#xff0c;一个对象在可以被使用之前必须要被正确地实例化。在Java代码中&#xff0c;有很多行为可以引起对象的创建&#xff0c;最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象&#xff0c;这种方式在Java规范中被称为 …

CakePHP中出现persistent is not writable等Warning的解决方法

在新部署CakePHP项目或者从SVN中重新Update项目的时候&#xff0c;有时候会出现下面的警告&#xff1a; Warning (512): D:\xampp\htdocs\xxxx\app\tmp\cache\ is not writable [CORE\cake\libs\cache\file.php, line 281] Warning (512): \persistent\ is not writable [CORE\…

MySQL5.5加主键锁读问题

背景有同学讨论到MySQL 5.5下给大表加主键时会锁住读的问题&#xff0c;怀疑与fast index creation有关&#xff0c;这里简单说明下。对照现象为了说明这个问题的原因&#xff0c;有兴趣的同学可以做对比实验。1) 在给InnoDB表创建主键期间&#xff0c;会锁住该表上的读数据2)…

ansible之playbook

关键字 关键字 关键字 关键字 关键字 关键字转载于:https://www.cnblogs.com/shui-mo/p/10482375.html

设计模式 之美 -- 工厂方法模式

文章目录1. 解决问题2. 应用场景3. 实现如下C实现C语言实现4. 缺点1. 解决问题 在简单工厂模式中&#xff0c;我们使用卖衣服进行举例&#xff0c;同一种工厂可以卖很多不同种类的衣服&#xff0c;工厂只是将衣服的生产过程进行了封装。 当我们增加衣服种类的时候&#xff0c…

java shiro实例_Apache Shiro入门实例

Shiro是一个强大灵活的开源安全框架&#xff0c;提供身份验证、授权、会话管理、密码体系。1.先创建一个Maven项目2.配置pomhttp://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0cn.edu.stushiro-test0.0.1-SNAPSHOTorg.apache.shiroshiro-core1.3.0org.slf4jslf4j-log…

采购申请-MRP

1、手工建立采购申请&#xff1a; ME51N 申请单建立的时候&#xff0c;在不知道给哪个部门使用的时候可以在科目指派中选择U 分配并处理采购申请&#xff1a;me57 A:首先分配供应商 B:在转换成PO 点自动分配-》点分配-》点处理分配完成PR转变成PO 2、MRP 首先要建立BOM,然后在建…

【C语言】07-预处理指令;-宏定义

预处理指令简介; 1,C在对源程序进行编译之前,会对一些特殊的预处理指令作解释,产生一个新的源程序,此过程叫做编译预处理.C在经过编译预处理之后才对新的源码进行通常的编译; 2,预处理以‘#’开头,且结尾不用分号,(用于和一般的C语句区分开来). 3,预处理指令可以出现在出现的任…

idea基于hibernate生成的Entitle对象,会忽略外键属性

需要自己手动添加 如 private String cgcode;BasicColumn(name "cgcode")public String getCgcode() {return cgcode;}public void setCgcode(String cgcode) {this.cgcode cgcode;} 转载于:https://www.cnblogs.com/asusdell/p/10482657.html

编程模式 之美 -- 抽象工厂模式

文章目录1. 解决问题2. 应用场景3. 实现如下&#xff1a;C实现C语言实现4. 缺点1. 解决问题 在工厂方法模式中&#xff0c;我们卖衣服。此时我们为每一种衣服创建不同的工厂&#xff0c;帽子有一个工厂专门创建&#xff0c;裤子有一个工厂专门创建&#xff0c;T恤有一个工厂专…

java map class_java – 将通用Class参数限制为实现Map的类

我正在尝试编写一个Map构建器.其中一个构造函数将允许客户端指定他们希望构建的Map类型public class MapBuilder {private Map map;/*** Create a Map builder* param mapType the type of Map to build. This type must support a default constructor* throws Exception*/pub…

双击进入物料数据的指定视图

SET PARAMETER ID MAT FIELD i_matnr-matnr.“物料号SET PARAMETER ID MXX FIELD K. 进入基本视图 "Table T132CALL TRANSACTION MM03 AND SKIP FIRST SCREEN. MXX 可以在后台查看&#xff1a; SPRO->后勤系统-一般->物料主档->设定物料主档->…

java中Integer装箱的注意

Integer inb 2;//自动装箱 Integer inc 2; System.out.println(inb inc );//输出true Integer biga 128; Integer bigb 128; System.out.println(biga bigb);//输出false上面的代码来自李刚老师的书&#xff0c;应该注意其中的细节.上面的输出与Integer的设计有关。1.系统…

rem自适应js

Rem自适应js---flexible.min.js 网上看到很多移动端适配的各种方法&#xff0c;由于原来工作中对rem的疏忽&#xff0c;所以决定重新学习rem~ 由于移动端特殊性&#xff0c;本文讲的是如何使用rem实现自适应&#xff0c;或叫rem响应式布局&#xff0c;通过使用一个脚本就可以re…

设计模式 之美 -- 建造者模式

文章目录1. 解决问题2. 应用场景3. 实现C语言实现C实现4. 缺点1. 解决问题 描述如下场景&#xff1a; 类的数据成员很多&#xff08;8个以上&#xff09;&#xff0c;当我们进行初始化的时候放在初始化列表中&#xff0c;影响类的可读性&#xff0c;同时校验初始化参数列表是…

dateformat java 并发_java.text.DateFormat 多线程并发问题

在日常开发中&#xff0c;java.text.DateFormat 应该算是使用频率比较高的一个工具类&#xff0c;经常会使用它 将 Date 对象转换成字符串日期&#xff0c;或者将字符串日期转化成 Date 对象。先来看一段眼熟的代码&#xff1a;类 DateUtils 的方法 formatForDay() 在多线程的情…

每天一个摆脱if-else工程师的技巧——优雅的参数校验

在日常的开发工作中,为了程序的健壮性,大部分方法都需要进行入参数据校验。最直接的当然是在相应方法内对数据进行手动校验,但是这样代码里就会有很多冗余繁琐的if-else。throw new IllegalArgumentException("用户姓名不能为空");throw new IllegalArgumentException("性别不能为空");throw new IllegalArgumentException("性别错误");

我下载的最新的linux ADT+eclipse中没有NDK

问题描述我下载的是 adt-bundle-linux-x86_64-20140702.zip 这个版本。我已经安装了CDT了&#xff0c;但是还是没有NDK可以设置&#xff0c;而且在project右键android tools下 没有Add Native Support这个选项求指教&#xff0c;谢谢&#xff01; 解决方案1你的Eclipse插件好…

Android中去掉标题的方法总结

方法一&#xff1a;也一般入门的时候经常使用的一种方法在setContentView()方法的前面插入代码&#xff1a; requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 package com.example.helloword;import android.os.Bundle; import android.app.Activity; import and…

ImportError: No localization support for language ‘eng’ in python

ImportError: No localization support for language ‘eng’ in python 遇到這一個問題&#xff0c;是因為有缺少檔案&#xff0c;我是因為使用 pyinstaller 去包裝執行檔&#xff0c;所以需要手動加入這一個設定值進 .spec 檔案裡&#xff1a; hiddenimports[mysql,mysql.con…

C++ 智能指针(unique_ptr / shared_ptr)代码实现

文章目录unique_ptr 智能指针的实现shared_ptr 智能指针的实现指针类型转换unique_ptr 智能指针的实现 一个对象只能被单个unique_ptr 所拥有。 #include <iostream>using namespace std;/*增加模板类型&#xff0c;保证智能指针的类型是由传入的类型决定的*/ template…

winform实现截图

这个截图模仿QQ截图&#xff0c;左键单击开始截图&#xff0c;鼠标移动出现方框确定截图尺寸&#xff0c;放开时为最终尺寸&#xff0c;双击鼠标弹出保存对话框进行保存。 还有一点就是&#xff0c;如果截图尺寸方框已经确定&#xff0c;移动鼠标到所选区域内时&#xff0c;鼠标…

java interface list_你了解注解内的@interface List么

Annotation, Multi-valued annotation, nested annotation, 多值注解, 嵌套注解今天在研究Spring MVC的Validation机制时(这里 | 还有这里)&#xff0c;简单看了下一些注解的源码&#xff0c;比如Min&#xff0c;发现以前从来没注意到的注解写法。看来基础知识有疏漏啊.../*** …

Struts 2的输入校验(一)

9 Struts 2的输入校验输入校验有两种&#xff1a;客户端和服务器端校验。客户端校验一般是通过JavaScript来完成&#xff0c;这种校验可减轻服务器压力。服务器校验主要通过服务器端编程的方式来完成。(1) 客户端校验客户端校验一般是通过JavaScript来完成&#xff0c;这种校验…

通过document.domain实现跨域访问

通过document.domain实现跨域访问&#xff1a;https://blog.csdn.net/nlznlz/article/details/79506655 前端跨域方法之document.domain和location.hash&#xff1a;https://blog.csdn.net/WEB_YH/article/details/79364565 转载于:https://www.cnblogs.com/bydzhangxiaowei/p/…

设计模式 之美 -- 原型模式

文章目录1. 解决问题2. 应用场景3. 实现方式C实现C语言实现4. 缺点5. 和其他三种创建模式的对比&#xff08;单例&#xff0c;工厂&#xff0c;建造者&#xff09;1. 解决问题 如果对象的创建成本较大&#xff0c;而同一个类的不同对象之间的差别不大&#xff08;大部分字段相…

Objective-C语法简记

开始学习iPhone开发了&#xff0c;虽然现在已经有了Swift&#xff0c;但我还是老老实实地学习Objective-C&#xff0c;鄙人入门的程序语言是C&#xff0c;后来学习了C#和Java&#xff0c;现在来学Objective-C&#xff0c;这篇只是一些很简略的笔记&#xff0c;不算是语法书。 代…

java编写最大公约数_Java编写最大公约数和最小公倍数

package javaapplication24;class NegativeIntegerException extends Exception{String message;public NegativeIntegerException(){message"方法的参数值不是正整数";}public String toString(){return message;}}class MaxCommonDivisor{public int getMaxCommonD…

肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法

由于能力有限&#xff0c;算法层面的东西自己去创新的很少&#xff0c;很多都是从现有的论文中学习&#xff0c;然后实践的。 本文涉及的很多算法&#xff0c;在网络上也有不少同类型的文章&#xff0c;但是肯定的一点就是&#xff0c;很多都是不配代码的&#xff0c;或者所附带…

【算法学习】堆排序建立最大堆

本文代码均转自&#xff1a; 作者&#xff1a;早就戒了 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/qq_37169817/article/details/79777264 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请附上博文链接&#xff01; 1 public class HeapSort { 2…