linux开发常用-shell_awk

目录

1.源头学习

2.用武之地

3.实践说明

4.相关资料

5.源码


1.源头学习

awk诞生于 GNU 软件家族:

   Software- GNU Project - Free Software Foundation

   对于GNU来讲有很多常用的命令,比如grep,sed等。在网站上能找到相关的文档和源码

   GNU使命明确,给于用户已足够的自由,代码文档学习和修改等非常自由

可以查看 awk 官方文档

作者在文档中写了以下抒情诗,这里表示膜拜下

2.用武之地

awk自己以前主要用于在服务器和大数据方面的分析,处理,统计

大型服务器集群的访问日志等分析处理

大数据的统计和排序,特定条件的过滤分析等

数据规则化过滤生成图表等

3.实践说明

awk工作的基本流程

  • 读取文件内容
  • 通过分隔符逐行分析,分解出每行的每个字段
  • 按照匹配规则处理相关字段
  • 输出预定结果到指定文件

awk命令格式

      awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]

     参数说明:

  • -F  field-separator  对每行字段解析的分隔符,一般是 空格
  • -v   定义变量
  • prog 匹配的pattern+action
  • -f  如果prog过长可以写入到一个脚本文件里面
  • file...  可以同时处理多个文件

    举例:

    awk   -F ','    '/prog_pattern/ { print "prog_action" }'    files-mail-list 

  3.1 program(prog)详解

     awk  'program'    input-file1    input-file2 ...

     可以由多个  pattern { action }   pattern { action } ...  组成

      先说明两个文件 以便后面写例子

      文件1  mail-list

Amelia 555-5553 amelia.zodiacusque@gmail.com F

Anthony 555-3412 anthony.asserturo@hotmail.com A

Becky 555-7685 becky.algebrarum@gmail.com A

Bill 555-1675 bill.drowning@hotmail.com A

Broderick 555-0542 broderick.aliquotiens@yahoo.com R

Camilla 555-2912 camilla.infusarum@skynet.be R

Fabius 555-1234 fabius.undevicesimus@ucb.edu F

Julie 555-6699 julie.perscrutabor@skeeve.com F

Martin 555-6480 martin.codicibus@hotmail.com A

Samuel 555-3430 samuel.lanceolis@shu.edu A

Jean-Paul 555-2127 jeanpaul.campanorum@nyu.edu R      

    文件2  inventory-shipped

Jan 13 25 15 115

Feb 15 32 24 226

Mar 15 24 34 228

Apr 31 52 63 420

May 16 34 29 208

Jun 31 42 75 492

Jul 24 34 67 436

Aug 15 34 47 316

Sep 13 55 37 277

Oct 29 54 68 525

Nov 20 87 82 577

Dec 17 35 61 401

Jan 21 36 64 620

Feb 26 58 80 652

Mar 24 75 70 495

Apr 21 70 74 514

执行的一个例子:

 从mail-list文件里面匹配包含 li 两个字母的条目, 然后打印匹配行的所有内容 $0 表示行的所有内容 ,$1, $2, $3 ..... 表示通过分隔符解析后的第一个字段,第二个字段,第三个字段 ...                 如 第一个行  $1 = "Amelia"  , $2 = "555-5553",

其中这里面pattern = /li/  action = {print $0}

3.1.1 pattern详解

  主要用一下几种类型

  • 正则表达式  /regular expression/  以 // 区分
  • 单个表达式  expression, 非0或者非空为匹配
  • 范围匹配  begpat, endpat  匹配到begin pattern之后,所有的动作到end pattern结束
  • 开始和结束定制  BEGIN END  在文件分析之前和之后的行为

  regular expression
    符合一般的正则表达式基本都可以
    例子: /foo|bar|baz/ { buzzwords++ }

  expression
    表达式可以包含各种逻辑运算符等
    例子:
       awk  '$1 == "li"  { print $2 }'  mail-list   #第一个字段等于li
       awk  '$1 ~ /li/     { print $2 }'  mail-list   #第一个字段包含li
       awk  '$1 !~ /li/     { print $2 }'  mail-list  #第一个字段不包含li
       awk   '/edu/ && /li/'    mail-list               #包含edu和li

   begpat, endpat
     
范围匹配
      例子:
        awk  '$1 == "on",  $1 == "off"'  mail-list   #第一个字段on到第一个字段off
        awk  '$1 == "Bill",  $1 == "Martin"'  mail-list  #结果如下
          Bill 555-1675 bill.drowning@hotmail.com A
          Broderick 555-0542 broderick.aliquotiens@yahoo.com R
          Camilla 555-2912 camilla.infusarum@skynet.be R
          Fabius 555-1234 fabius.undevicesimus@ucb.edu F
          Julie 555-6699 julie.perscrutabor@skeeve.com F
          Martin 555-6480 martin.codicibus@hotmail.com A

    BEGIN END
       在匹配文件之前和之后执行的操作
       例子:
         awk 'BEGIN { print "Analysis of \"li\"" } /li/ { ++n } END { print "\"li\" appears in", n, "records."}' mail-list   #结果如下
          Analysis of "li"
          "li" appears in 4 records.
        说明:n为自定义变量,总共3个匹配和动作
                   BEGIN { print "Analysis of \"li\"" }  #分析之前的动作
                   /li/ { ++n }            #逐行分析的动作
                   END { print "\"li\" appears in", n, "records."}  #分析完之后的动作

3.1.2 action详解
  动作以{} 区分, 功能很强大,可以定义变量,加入if,for,while等控制语句,有内置函数也可以自定义函数等,主要介绍2种类型:

  • 一般表达式  Expressions
  • 控制复合语句 Control / Compound statements

  Expressions
   
一般打印输出,变量计数等
    例子:
       awk 'length($0) > 80 {print $0}' mail-list  #一行的字数大于80,打印
       awk 'length($0) > 80 {word80++}' mail-list  #一行的字数大于80,计数

  Control / Compound statements
   
可以有if else for等程序化语句,可以有函数等或自定义函数和程序语句
    例子:
      awk '{ if (length($0) > max) max = length($0) } END { print max }' mail-list  #计算最长行的字数
      awk '{ if (length($0) % 2 == 0) print "word is even"; else print "word is odd"}' mail-list #if-else语句,计数字数奇偶性
      awk ' { i = 1; while (i <= 3) { print $i ;i++ } }' inventory-shipped       #while语句
      awk ' { for (i = 1; i <= 3; i++) print $i }' inventory-shipped             #for语句

     说明:length是内置的字符串函数,控制语句类似c语言里面的语法,注意分号

4.相关资料

更多语法和用法,参考GNU官网

5.源码

参考GNU官网

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X-道至简

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值