GAWK:报告生成器,格式化文本输出

    awk [options] ‘program’ var=value file…
    awk [options] -f programfile var=value file…
    awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...

  awk程序组成部分:

    BEGIN语句块、能够使用模式匹配的通用语句块、END语句块

    选项:

      -F:指明输入时用到的字段分割符;
      -v var=value:自定义变量
      -f:指定awk脚本,从脚本中读取program

    基本格式:

      awk [options] 'program' file...

      program:pattern{action statements;...}  通常在单引号或双引号中;
      pattern与action:
        pattern部分决定动作语句何时触发及事件
          BEGIN:模式匹配之前要执行的动作

          END:模式匹配结束之后要执行的动作

        action statements对数据进行处理,放在{}内指明;
          print  $0,$!.......$(NF-1)........$NF(最后一列)

    分隔符,域,记录

      awk执行时,由分隔符分隔的字段(域)标记$1,$2...$n称为域标识。$0为所有域。
      文件的每一行称为记录;
      省略action,则默认执行print $0的操作;

awk的工作原理:

  1)、执行BEGIN{action;...}语句块中的语句;
  2)、从文件或标准输入(stdin)读取一行,然后执行pattern{action;...}语句块,它会逐行扫描文件,从第一行到最后一行重复这个过程,知道文件被全部读取完毕;
  3)、当读至输入流末尾时,执行END{action;...}语句块

  BEGIN语句块:在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常 可以写在BEGIN语句块中。

  END语句块:在awk从输入流中读取完所有的行之后即被执行,比如 打印所有行的分析结果这类信息汇总都是在END语句块中完成它也是一个可选语句块

  pattern语句块中的通用命令是最重要的部分,也是可选的。如果 没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

    print格式:print item1,item2,...
      1)、逗号为分隔符;
      2)、输出的个item可以是字符串,也可以是当前记录的字段、变量或awk的表达式;
      3)、如省略item,相当于print $0;

     awk '{print "hello,awk"}'
     awk –F: '{print}' /etc/passwd         # -F指定分割符为 :冒号
     awk –F: '{print “wang”}' /etc/passwd
         awk –F: '{print $}' /etc/passwd
    awk –F: '{print $}' /etc/passwd
    awk –F: '{print $”\t”$}' /etc/passwd
    tail – /etc/fstab |awk '{print $,$}'

    变量:

      FS:输入字段分隔符,默认为空白字符;

      awk -v FS=':' '{print $1,FS,$3}' file

      

      OFS:输出字段分隔符,默认为空白字符;指定输出时的分隔符是什么,一般可以进行分隔符号替换,类似下面的ORS的作用

      awk -v FS=':' -v OFS=':' '{print $1,$2,$3}' file
      

      [root@mysql-141 ~]# awk -v FS=':' -v OFS='#' '{print $1,$2,$3}' /etc/passwd
      root#x#0
      bin#x#1
      daemon#x#2
      adm#x#3

     

      RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效;

      awk -v RS=' ' '{print}' file

      

      ORS:输出记录分隔符,输出时用指定符号代替换行符;

      awk -v RS=' ' -v ORS='$$$' '{print}' file

      

      NF:字段数量

      awk -F: '{print NF}' file
      awk -F: '{print $(NF-1)}' file
      # 显示文件的第一列,第三列,倒数第二列和最后一列

        [root@mysql-141 ~]# awk -F : '{print $1,$2,$(NF-1),$NF}' /etc/passwd
        root x /root /bin/bash
        bin x /bin /sbin/nologin
        daemon x /sbin /sbin/nologin
        adm x /var/adm /sbin/nologin

      

      NR:行号

      awk -F: '{print NR,$1}' file   # 与FNR类似
      awk END'{print NR}' file
      

      [root@mysql-141 ~]# awk END'{print NR}' /etc/passwd  #将文件内容读取完成之后,统计行数
       26

      awk 'NR==2,NR==6{print NR,$0}}' file  #显示文件2-6行

      

      FNR:各文件的行号分别计数;

      awk -F: '{print FNR,$1}' file1 file2...

      [root@mysql-141 ~]# awk -F: '{print FNR,$1}' /etc/passwd
      1 root
      2 bin
      3 daemon
      4 adm
      5 lp
      6 sync
      7 shutdown
      8 halt

      

      FILENAME:当前文件名;文件内容有多少行,awk就会输出多少行

     awk '{print FILENAME}' FILE1 FILE2...

      [root@mysql-141 ~]# awk '{print FILENAME}' /etc/passwd |wc -l
      26
      [root@mysql-141 ~]# wc -l /etc/passwd
      26 /etc/passwd

      

      ARGV:数组,保存的是命令行所给定的各参数;

      awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
      awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab
      

      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab      # 相当于shell里面的$1 $2 $3 的概念
      /etc/fstab
      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/inittab
      /etc/inittab
      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
      awk
      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[3]}' /etc/fstab /etc/inittab

    算术操作符:
      x+y x-y x*y x/y x^y x%y
      -x:转换为负数;
      +x:转换为数值,变量通过+连接运算,自动强制将字符串转为整形,非数字变成0,发现第一个非数字字符,后面的自动忽略;

字符串操作符:没有符号的操作符,字符串连接
    赋值操作符:
      

      =    +=    -=     *=      /=      %=     ^=      ++      --

    比较操作符:
      

      ==   !=   >    >=    <    <=

    模式匹配符:
      ~:左边的内容是否被右边的模式包含匹配

       !~:是否不匹配;

     [root@mysql-141 ~]# awk -F: '$0 ~ /root/{print $1}' /etc/passwd    # 以:为分隔符,匹配全部内容包含root的行,打印第一列

       root
       operator

      [root@mysql-141 ~]# awk '$0 ~ "^root"' /etc/passwd       # 匹配所有内容,期初以root开头的行
       root:x:0:0:root:/root:/bin/bash  

      [root@mysql-141 ~]# awk -F: '$3==0' /etc/passwd        # 匹配以冒号为分隔符,第三列是0的行
      root:x:0:0:root:/root:/bin/bash

 

cat >>/tmp/reg.txt<<EOF
Zhang Dandan :::
Zhang Xiaoyu :::
Meng Feixue :::
Wu Waiwai :::
Liu Bingbing :::
Wang Xiaoai :::
Zi Gege :::
Li Youjiu :::
Lao Nanhai :::
EOF

    操作符:

      与&&

       或||

       非!

示例:

[root@mysql-141 ~]# awk -F : '$3>=0 && $3<=1000 {print $1}' /etc/passwd
root
bin
daemon
adm
lp

[root@mysql-141 ~]# awk -F : '$3==0 || $3>=1000 {print $1}' /etc/passwd
root

[root@mysql-141 ~]# awk -F : '!($3==0) {print $1}' /etc/passwd
bin
daemon
adm
lp

[root@mysql-141 ~]# awk -F : '!($3>=500) {print $3}' /etc/passwd
0
1
2
3
4
5
6

    awk PATTERN:
      1)、如果未指定:空模式,匹配每一行;
      2)、/regular expression/:仅处理能够被模式匹配到的行,需要用//括起来;

awk '/^UUID/{print $1}' /etc/passwd
awk '!/^UUID/{print $1}' /etc/passwd

      3)、relational expression:关系表达式,结果未"真"才会被处理;
        真:结果为非0值,非空字符串;
        假:结果为空字符串或0值;

awk -F : 'i=1;j=1{print i,j}' /etc/passwd
awk '!0' /etc/passwd ; awk '!1' /etc/passwd
awk –F : '$3>=1000{print $1,$3}' /etc/passwd
awk -F : '$3<1000{print $1,$3}' /etc/passwd

[root@mysql-141 ~]# awk -F : '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
lipeng /bin/bash

[root@mysql-141 ~]# awk -F : '$NF ~ /nologin$/{print $1,$NF}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
mail /sbin/nologin
uucp /sbin/nologin

      4)、line ranges:行范围:
        startline,endine:/pat1/,/pat2/ 不支持直接给出数字格式:

[root@mysql- ~]# awk -F: '/^root\>/,/^nobody\>/{print $1}' /etc/passwd
root
bin
daemon
adm
lp
nobody
[root@mysql- ~]# awk -F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
uucp
operator
games
gopher
ftp

  awk数组概念:

预备知识: 了解两种awk运算方法
    1) 累加运算 1+1+1
      i=i+1 i初始状态为0
      i++
      eg: 统计/etc/services文件中空行数量

      第一个里程: 找出文件中空行信息
      awk '/^$/' /etc/services

      第二个里程: 统计空行数量
      awk '/^$/{i=i+1;print i}' /etc/services

PS: awk中所有字符串信息都会识别为变量名称信息, 调取变量是不需要加上$符号
awk中想显示指定字符串信息, 需要在字符串外面加上双引号信息

[root@oldgirl ~]# awk '/^$/{i=i+1;print i}' /etc/services
1 # i=i+ i= i=+ --> i=
    # i=i+ i= i=+ --> i=
    # i= i=+ --> i= 16 [root@oldgirl ~]# awk '/^$/{i=i+1}END{print i}' /etc/services  # 将文件内容加载完之后,做出统计

    2) 求和运算 10+20+5
       i=i+$n i的初始状态为0   $n取第几列数值信息

[root@oldgirl ~]# seq |awk '{i=i+$0;print i}'
i=i+$ i= $= i=+ --
i=i+$ i= $= i=+ --
i=i+$ i= $= i=+ -- 55

  [root@mysql-141 ~]# seq 10|awk '{i=i+$0;print i}'
    1
    3
    6
    10
    15
    21
    28
    36
    45
    55

    3). 数组的表现形式       

        数组中的括号里面的内容

        hotel[元素01]=xiaolizi1  --- 调用print xiaolizi1[元素01]--- xiaolizi1
        hotel[元素02]=xiaolizi2 --- 调用print xiaolizi2[元素02]--- xiaolizi2

      数组统计命令组成说明:
      1) 找出要统计的信息
        $1

      2) 把指定要统计信息作为数组的元素
        h[$1]

      3) 利用统计运算公式,进行运算
        h[$1]=h[$1]+1 --- i=i+1

      4) 显示运算的结果信息
        a 只看某一个元素的结果信息

     awk '{h[$1]=h[$1]+1}END{print h["101.226.61.184"]}' access.log
     

        b 要看全部元素的结果信息
         

     awk '{h[$1]=h[$1]+1}END{print h["101.226.61.184"],h["114.94.29.165"]}' access.log 
      
# 精简后命令
      awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log 

    for name in 101.226.61.184 114.94.29.165
      print h[$name]

      ==>
    for(name in h) --- > echo name=h=第一个元素信息
    echo name=h=第二个元素信息

说明: 循环中读取数组名称==读取每一个元素名称信息

cat >>url.txt<<EOF
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
EOF
awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log   

[root@mysql-141 ~]# awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log
101.226.61.184 5
27.154.190.158 2
218.79.64.76 2
114.94.29.165 1

第一步: 定义数组信息
awk '{h[$1]}' access.log
说明: 数组中的元素就是你关注要统计的列的信息 第二步: 进行统计运算,编写公式
awk '{h[$1]=h[$1]+1}' access.log 第三步: 编写元素循环信息
awk '{h[$1]=h[$1]+1}END{for(name in h)}' access.log 第四步: 输出结果信息
awk '{h[$1]=h[$1]+1}END{for(name in h) print name,h[name]}' access.log

将文本内容格式化输出

  原文如下:

job_name    job_group
syncCommStockJob dataSync
syncStoreChnlJob dataSync
syncOrderJob dataSync
syncReportStoreJob dataSync
hdfsScanJob report
orderSaleDailyJob report
jdzmdOrdersJob report
jdCanJob report

  使用awk格式化输出后

cat xxx.txt | awk '{printf "%-30s%-15s\n",$1,$2}'               
      #%-30s表示输出字符串,宽度30位(字符串如果过长,可以自己调整),左对齐.%-15s用来指定第二列的,左对齐,宽度15.两个百分号之间可以没有空格.使用\n对每一行的输出加上换行符 job_name job_group
syncCommStockJob dataSync
syncStoreChnlJob dataSync
syncOrderJob dataSync
syncReportStoreJob dataSync
hdfsScanJob report

文本处理三剑客之 awk的更多相关文章

  1. 文本处理三剑客之AWK的用法

    1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...

  2. 文本处理三剑客之awk

    简介 awk是一种处理文本文件的语言,是一个强大的文本编辑工具.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理. gawk 用法:gawk [optio ...

  3. 文本处理三剑客之awk(No.1)

    示例1:只查看test.txt文件内的第3到第7行的内容 awk '{if(NR>=3 && NR<=7) print $0}' test.txt #其中的$0是输出整个行 ...

  4. shell脚本之正则表达和文本处理(文本处理三剑客:1、grep 2、sed 3、awk)

    文本处理三剑客:1.grep  2.sed  3.awk 一.grep:(过滤) grep的使用,主要的参数有: -n  :显示行号:-o  :只显示匹配的内容-q  :静默模式,没有任何输出,得用e ...

  5. Linux实战教学笔记18:linux三剑客之awk精讲

    Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...

  6. 文本处理三剑客之 Sed ——一般编辑命令

    sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...

  7. 文本处理三剑客之 grep

    grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...

  8. (转)不看绝对后悔的Linux三剑客之awk实战精讲

    原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...

  9. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

随机推荐

  1. 【webpack】从零开始学webpack

    背景:目前公司的项目全是用vue写的,建项目的话使用的是用vue-cli直接配置好的webpack,进行打包.现在我就是想实现自己写一个类似vue-cli的架子 一.安装全局依赖 npm instal ...

  2. Spring Boot—09通过Form提交的映射

    package com.sample.smartmap.controller; import org.springframework.beans.factory.annotation.Autowire ...

  3. 活字格企业 Web 应用生成器新手上路指南

    活字格是一款企业 Web 应用生成器,使用了类 Excel 的设计界面,通过简单的拖拽操作,就能快速制作出一个 Web 信息管理系统.在整个使用过程中无需专业软件知识,没有任何技术门槛,能轻松实现各行 ...

  4. ios虚拟机安装 (三)

    安装mac系统出现欢迎使用的界面-->一直继续(个人设定) 点击左上角-->Dock-->启动放大 Safari 浏览器

  5. Linux 启动脚本及chkconfig命令之自启动服务

    有时我们会碰到这样的情况,系统启动的时候报一大堆无法连接mysql的错误,问题在mysql数据库还没有启动的时候已经启动了一些需要连接mysql数据库的服务.这样我们就得修改启动顺序,把需要连接mys ...

  6. vmware centos 安装

    一.分区 一块硬盘主分区+扩展分区最多只能有4个,其中扩展分区最多只能有1个.扩展分区不能写入数据,只能包含逻辑分区.这些都不是linux的限制,而是硬盘结构的限制. 分区号 第一种分区法: |--- ...

  7. eclipse maven构建的java web工程项目 在修改了工程项目名时,tomcat启动异常java.lang.IllegalArgumentException: Can't convert argument:null

    问题 我修改了前一个项目的名称.重新启动该项目至tomcat,报错:Java.lang.IllegalArgumentException: Can't convert argument: null 因 ...

  8. The Go scheduler

    转载自:http://morsmachine.dk/go-scheduler Introduction One of the big features for Go 1.1 is the new sc ...

  9. 不同服务器数据库之间的数据定时同步到sql server (支持mysql,oracle数据库同步到sql server)

    1,在目标数据库新增服务器对象->连接到服务器->新建服务器连接 2,编写数据同步业务PROC ALTER PROC TestProc AS BEGIN --打开完全事物回滚 SET XA ...

  10. 判断js对象类型

    javascript中检测对象的类型的运算符有:typeof.constructor.instanceof.prototype. 1.typeof typeof是一个一元运算符,返回结果是一个说明运算 ...