zoukankan      html  css  js  c++  java
  • shell-awk

    awk基本语法

    awk也是一款比较强大的文本处理工具

    awk是一种强大的文本处理工具,是Linux以及Unix环境中现有的功能最强大的数据处理引擎之一,awk具备一个完美的编程语言应具有的几乎所有的精美特性,是一种用于处理文本的编程语言工具

    awk的用途

    awk用于在文件中查找与模式匹配的行,并在这些行上执行指定的操作!
    awk命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行,然后在任何与扩展正则表达式匹配的行上执行操作,如果找不到匹配内容,则继续处理下一行。
    awk命令的模式搜索比grep命令更加常用。

    记录和字段

    awk把输入流看作一连串记录的集合,每条记录又进一步细分为字段。这里的记录和字段,和数据库中的记录和字段非常的类似。
    记录是由记录分隔符RS隔开的一组数据,记录分隔符的缺省值是换行符,他使文件中的每一行成为一个单独的记录,在awk中,记录分隔符可以通过设置awk的内奸变量RS来更改

    awk的程序指令模型

    awk的两种形式语法格式:

    awk [option] 'commands' filename
    awk [option] -f awk-script-file filename

    一个典型的awk程序指令是由模式(pattern)和大括号括起来的操作(action)组合而成的,具体格式如下:

    pattern {action}

    对于awk读取的每条记录,如果一个记录与指定模式(pattern)想匹配,或包含与该模式匹配的字段,那么执行相应的操作(action)。

    具体事例看我另一篇文档,或者自行百度。

    awk程序流程介绍

    1、自动从输入读取一条记录
    2、自动更新相关的内建变量的值,例如:NF,NR,$0等
    3、依次执行程序中所有的pattern{action}指令
    4、执行完所有的pattern{action}指令后,若从输入还可以读取到数据,则反复执行1-4步骤
      以上四个步骤的重复复执行,完全由awk来自动进行,无需使用者编写这个循环,使用者只需要根据业务需求设计pattern{action}即可

    具体案例自行百度,这块接触的都是简单的操作,复杂的目前没时间学。

    awk模式匹配

    awk总的各种模式详解

    下面为awk程序指令的模型,每个awk程序都是由一些下面的语句组成,从而完成特定的功能:
    pattern{action}
    awk通过pattern(模式)来控制是否处理当前记录,如果当前记录和pattern匹配,则执行action(操作),在awk中,有以下几种模式:
      1、正则表达式
      2、关系表达式
      3、组合的pattern
      4、pattern1,pattern2
      5、算数表达式
      6、BEGIN
      7、END

    案例操作:首先新建一个文件avengers.txt,以实例的方式一一进行说明:

    [root@localhost test]# vim avengers.txt
    [root@localhost test]# cat avengers.txt 
    hulk 85 92 78
    captain 89 90 75
    ironman 84 88 80 
    widow 83 78 90
    hawkeye 86 88 79
    [root@localhost test]# 

    这是一个简单的学生成绩表,共五个学生的成绩,每条记录包括:名字,然后是三门课的成绩

    1.正则表达式,如果使用元字符{}前使用两个/ "//"里面使用元字符。

    [root@localhost test]# awk '/9[0-9]/ {print $0}' avengers.txt 
    hulk 85 92 78
    captain 89 90 75
    widow 83 78 90
    [root@localhost test]# 

    指令查询有一门成绩在[90-99]区间的学生的成绩信息,这里pattern的类型为正则表达式

    [root@localhost test]# awk '$3 ~ /9[0-9]/ {print $0}' avengers.txt 
    hulk 85 92 78
    captain 89 90 75
    [root@localhost test]# 

    这条指令在上一条的基础上增加了限制,需要第二门课在【90-99】区间才可以与模式匹配,这里的~表示变量是否采用正则表达式。

    2.关系表达式

    [root@localhost test]# awk '$3 >= 90 {print $0}' avengers.txt 
    hulk 85 92 78
    captain 89 90 75
    [root@localhost test]# 

    这条指令的作用也是查询数学成绩在90分以上的学生成绩信息,不过比正则表达式中的范围要大(100页符合)

    3.组合的pattern(模式)

    [root@localhost test]# awk '$3 >= 90 && $3 < 100 {print $0}' avengers.txt 
    hulk 85 92 78
    captain 89 90 75
    [root@localhost test]# 

    布尔运算符 ||(或) &&(和) 以及!(不)将模式组合,组合后如果求值为真则模式匹配,否则不匹配。

    4.pattern1,pattern2

    [root@localhost test]# awk 'FNR == 2, FNR == 4 {print $0}' avengers.txt 
    captain 89 90 75
    ironman 84 88 80 
    widow 83 78 90
    [root@localhost test]# 

    其实这个也可以归为组合的模式总共,只是这种模式比较特殊,所有单独列出。(逗号)隔开的两个pattern指定一个范围,对从匹配的第一个pattern的记录开始,到匹配第二个pattern结束的所有记录执行action。

    5.算术表达式

    [root@localhost test]# awk 'FNR == 2, FNR == 4 {print $0,$2+$3+$4}' avengers.txt 
    captain 89 90 75 254
    ironman 84 88 80  252
    widow 83 78 90 251
    [root@localhost test]# 

    算数运算包括:+(加),-(减),*(乘),/(除),%(取模)。

    6.BEGIN

    BEGIN模式是awk的一种特殊的pattern,BEGIN模式指定的操作在读取任何输入之前执行,且只执行一次。使用BEGIN模式甚至不需要指定输入文件,一般把与数据文件内容无关以及只需执行一次的部分置于BEGIN模式为pattern的action中。

    假如我们要讲学生成绩表打印出来,那总得加点表头什么的吧,就可以写在BEGIN中了。

    [root@localhost test]# awk 'BEGIN {print "Print student score table"}'
    Print student score table
    [root@localhost test]# 

    7.END

    end模式也是awk中一种特殊的pattern,END模式指定的操作在读取所有的输入后执行。

    [root@localhost test]# awk 'END {print "Work done "}' avengers.txt 
    Work done 
    [root@localhost test]# 

     

    更多操作请自行百度。目前用到的不是特别多。。

  • 相关阅读:
    正则化方法:L1和L2 regularization、数据集扩增、dropout
    如何估算深度神经网络的最优学习率
    机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size
    leetcode 389. Find the Difference
    python导入模块
    如何选择正确的激活函数?
    leetcode 690. Employee Importance——本质上就是tree的DFS和BFS
    leetcode 258. Add Digits——我擦,这种要你O(1)时间搞定的必然是观察规律,总结一个公式哇
    leetcode 520. Detect Capital
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(12月21日)
  • 原文地址:https://www.cnblogs.com/52-qq/p/9605104.html
Copyright © 2011-2022 走看看