zoukankan      html  css  js  c++  java
  • Linux:三剑客之 awk

    awk概念介绍说明

    作用特点:
    1. 排除信息
    2. 查询信息
    3. 统计信息
    4. 替换信息
    语法格式:
    sed [参数] '条件-处理方式' 文件 
    awk [参数] '模式-动作'     文件	
    

    awk实际操作过程:

    准备测试环境

    [root@oldboyedu ~]# cat awk_test.txt 
    Zhang	Dandan		41117397	:250:100:175
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    Liu	Bingbing	41117483	:250:100:175
    Wang	Xiaoai		3515064655	:50:95:135
    Zi	Gege		1986787350	:250:168:200
    Li	Youjiu		918391635	:175:75:300
    Lao	Nanhai		918391635	:250:100:175
    

    命令查询信息方法:

    按照行号查询信息:
    awk 'NR=2' awk_test.txt
    [root@oldboyedu ~]# awk 'NR=2' awk_test.txt
    Zhang	Dandan		41117397	:250:100:175
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    Liu	Bingbing	41117483	:250:100:175
    Wang	Xiaoai		3515064655	:50:95:135
    Zi	Gege		1986787350	:250:168:200
    Li	Youjiu		918391635	:175:75:300
    Lao	Nanhai		918391635	:250:100:175
    [root@oldboyedu ~]# awk 'NR==2' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    [root@oldboyedu ~]# awk 'NR==2,NR==4' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    [root@oldboyedu ~]# awk 'NR==2;NR==4' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    Wu	Waiwai		70271111	:250:80:75
    
    ps: 在linux系统中
    oldboy=10  	赋值变量信息
    oldboy==2  	真正oldboy等于数值2
    
    按照字符查询信息:
    [root@oldboyedu ~]# awk '/Xiaoyu/' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    [root@oldboyedu ~]# awk '/Xiaoyu/,/Waiwai/' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    [root@oldboyedu ~]# awk '/Xiaoyu/;/Waiwai/' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    Wu	Waiwai		70271111	:250:80:75
    

    测验:

    01. 显示xiaoyu的姓氏和ID号码(???)
    [root@oldboyedu ~]# awk '/Xiaoyu/{print $1","$3}' awk_test.txt 
    Zhang,390320151
    [root@oldboyedu ~]# awk '/Xiaoyu/{print $1,$3}' awk_test.txt 
    Zhang 390320151
    
    02. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字
    [root@oldboyedu ~]# awk '/Zhang/{print $4}' awk_test.txt 
    :250:100:175
    :155:90:201
    [root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt 
    :250:100:175
    :155:90:201
    [root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt|awk -F ":" '{print $3}'
    100
    90
    
    awk '/Zhang/{print $NF}' 
    awk -F ":" '{print $3}'
    [root@oldboyedu ~]# awk -F ":" '/^Zhang/{print $3}' awk_test.txt 
    100
    90
    
    [root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' awk_test.txt 
    Zhang Dandan 100
    Zhang Xiaoyu 90
    [root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' awk_test.txt 
    Zhang Dandan 100
    Zhang Xiaoyu 90
    
    03. 显示所有以41开头的ID号码的人的全名和ID号码
    [root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt 
    Zhang Dandan 41117397
    Liu Bingbing 41117483
    
    04. 显示所有ID号码最后一位数字是1或5的人的全名
    方法一:
    awk '$3~/1$|5$/{print $1,$2}' awk_test.txt
    [root@oldboyedu ~]# awk '$3~/1$|5$/{print $1,$2}' awk_test.txt|column -t
    Zhang  Xiaoyu
    Wu     Waiwai
    Wang   Xiaoai
    Li     Youjiu
    Lao    Nanhai
    Lao    Nanhai
    
    方法二:
    [root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
    
    方法三:
    [root@oldboyedu ~]# awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
    
    05. 显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
    [root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $NF}' awk_test.txt 
    :155:90:201
    [root@oldboyedu ~]# #gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
    [root@oldboyedu ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt 
    $155$90$201
    
    文件中空行进行排除/文件中注释信息进行排除
    grep -Ev "^#|^$"  文件信息 
    sed -n '/^#|^$/!p' 文件信息
    awk '/^#|^$/'
    [root@oldboyedu ~]# awk '$0~/^#|^$/'  awk_test.txt 
    #Liu    Bingbing 41117483    :250:100:175
    
    [root@oldboyedu ~]# awk '$0!~/^#|^$/'  awk_test.txt 
    Zhang  Dandan   41117397    :250:100:175
    Zhang  Xiaoyu   390320151   :155:90:201
    Meng   Feixue   80042789    :250:60:50
    Wu     Waiwai   70271111    :250:80:75
    Wang   Xiaoai   3515064655  :50:95:135
    Zi     Gege     1986787350  :250:168:200
    Li     Youjiu   918391635   :175:75:300
    Lao    Nanhai   918391635   :250:100:175
    Lao    Nanhai   918394135   :250:100:175
    

    总结:awk命令中$符号用法

    $1 $2 $3 : 取第几列信息
    $NF      : 取最后一列
    $(NF-n)  : 取倒数第几列
    $0       : 取所有列的信息
    
    如何利用awk取出IP地址信息:
    ip a s eth0|awk -F "[ /]+" 'NR==3{print $5}'
    hostname -i 
    

    awk高级功能说明

    a 对日志信息进行统计(计数)

    b 对日志信息数值进行求和 客户端-下载 服务端-上传 消耗网络流量

    c (数组)进行排序分析

      排序
      01 192.168.2.1  600  192  深圳    10万   
      02 192.168.1.10 500  18   上海
      03 192.168.3.10 200  20   广州
                           30   东北    2千  
      运维总监---运营(推广)总监
    

    d 可以进行脚本编写(循环语句 判断语句) sh awk_nginx.log

    awk模式概念说明: 匹配的条件信息

    普通的模式:

    01. 正则表达式作为模式
        awk '/^oldboy/{print xx}'
    
    02. 利用比较匹配信息
        NR==2
    	NR>=2
        NR<=2
    
    03. NR2,NR10

    特殊的模式

    BEGIN{} 在awk执行命令前做什么事情:
    [root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}' awk_test.txt |column -t
    姓     名        QQ号        捐款记录
    Zhang  Dandan    41117397    :250:100:175
    Zhang  Xiaoyu    390320151   :155:90:201
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Wang   Xiaoai    3515064655  :50:95:135
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    Lao    Nanhai    918394135   :250:100:175
    
    修改内置分隔符变量
    awk -F ":" '{print $2}' awk_test.txt
    [root@oldboyedu ~]# awk  'BEGIN{FS=":"}{print $2}' awk_test.txt 
    
    END{} 在awk执行命令结束之后做的操作
    [root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' awk_test.txt |column -t 
    姓        名        QQ号        捐款记录
    Zhang     Dandan    41117397    :250:100:175
    Zhang     Xiaoyu    390320151   :155:90:201
    Meng      Feixue    80042789    :250:60:50
    Wu        Waiwai    70271111    :250:80:75
    Liu       Bingbing  41117483    :250:100:175
    Wang      Xiaoai    3515064655  :50:95:135
    Zi        Gege      1986787350  :250:168:200
    Li        Youjiu    918391635   :175:75:300
    Lao       Nanhai    918391635   :250:100:175
    Lao       Nanhai    918394135   :250:100:175
    操作结束
    

    统计累加运算测试:

    01. 统计/etc/services文件中空行数量
    利用awk公式进行累加运算
    [root@oldboyedu ~]# i=0
    [root@oldboyedu ~]# echo $((i=i+1))
    1
    [root@oldboyedu ~]# echo $((i=i+1))
    2
    [root@oldboyedu ~]# echo $((i=i+1))
    3
    
    awk '/^$/' /etc/service
    [root@oldboyedu ~]# awk '/^$/{i=i+1;print i}' /etc/services 
    空行 i=i+1 0+1  i=1
    空行 i=i+1 1+1  i=2
    空行 3
    空行 4
    空行 5
    空行 6
    空行 7
    空行 8
    空行 9
    空行 10
    空行 11
    空行 12
    空行 13
    空行 14
    空行 15
    空行 16
    空行 i=i+1 16+1 i=17 
    [root@oldboyedu ~]# awk '/^$/{i=i+1}END{print i}' /etc/services 
    17
    
    02. 统计/etc/services文件中有井号开头的行
    awk '/^#/{i++}END{print i}' /etc/services
    
    03. 统计系统中有多少个虚拟用户 普通用户
    第一个历程: 用户信息都保存在什么文件中了
    用户信息保存文件: /etc/passwd
    
    第二个历程: 从文件中匹配出虚拟用户 普通用户
    匹配普通用户
    awk '$NF~/bash/' /etc/passwd 
    awk '$NF~//bin/bash/' /etc/passwd 
    
    第三个历程: 进行统计
    普通用户数量
    [root@oldboyedu ~]# awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd
    63
    虚拟用户数量
    [root@oldboyedu ~]# awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd
    22
    
    求和运算:
    sum=sum+$n(需要进行数值求和的列)
    [root@oldboyedu ~]# seq 10|awk '{sum=sum+$1;print sum}'
    1  sum=sum+$1  0+1 sum=1
    2  sum=sum+$1  1+2 sum=3
    3  sum=sum+$1  3+3 sum=6
    4              6+4 sum=10
    5             10+5 sum=15
    6             15+6 sum=21
    7      28
    8      36
    9      45
    10           45+10 sum=55
    
    测试
     求出测试文件中 所有人第一次捐款的总额和第三次捐款总额
       显示表头 
       第一总额  第三次总额 	
       xxx        xxxx	 
       awk -F ":" 'BEGIN{print "第一次总额","第三次总额"};/.*/{print $2,$4}'  awk_test.txt
       [root@oldboyedu ~]# awk -F ":" 'BEGIN{print "第一次总额","第三次总额"}{a=a+$2;b=b+$4}END{print a,b}' awk_test.txt|column -t
       第一次总额  第三次总额
       2130        1661
  • 相关阅读:
    使用promise手动封装ajax函数
    node c++多线程插件构想
    node c++多线程插件 第一天 c++线程相关函数
    gps数据转百度地图坐标
    node.js异步控制流程 回调,事件,promise和async/await
    重回博客 谈一谈Node中的异步和单线程
    关于js模拟c#的Delegate(委托)实现
    基础知识 字符编码简介
    工作经历20130316
    Sql Server 学习1
  • 原文地址:https://www.cnblogs.com/moox/p/12197505.html
Copyright © 2011-2022 走看看