zoukankan      html  css  js  c++  java
  • awk 用法介绍

    awk 用法介绍

    欢迎来到 来到大浪涛天的博客

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

    awk 用法介绍

    1. awk概念介绍说明

    作用特点:

    • 排除信息
    • 查询信息
    • 统计信息
    • 替换信息

    2. 语法格式:

       sed [参数] '条件-处理方式' 文件 
       awk [参数] '模式-动作'     文件	

    3. 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

    3.1 命令查询信息方法:

    1. 按照行号查询信息:
       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
    1. 按照字符查询信息:
        [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
    1. 按照字符查询打印列:
    • 显示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
    • 姓氏是zhang的人,显示他的第二次捐款金额及他的名字
        [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
    • 显示所有以41开头的ID号码的人的全名和ID号码
    	[root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt 
        Zhang Dandan 41117397
        Liu Bingbing 41117483
    • 显示所有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
    • 显示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取出IP地址信息:
    	ip a s eth0|awk -F "[ /]+" 'NR==3{print $5}'
    	hostname -i 

    4. awk命令中$符号用法

    • $1 $2 $3 : 取第几列信息
    • $NF : 取最后一列
    • $(NF-n) : 取倒数第几列
    • $0 : 取所有列的信息

    5. awk高级功能说明

    1. 对日志信息进行统计(计数)
    2. 对日志信息数值进行求和 客户端-下载 服务端-上传 消耗网络流量
    3. (数组)进行排序分析
    4. 匹配的条件信息
    • 普通的模式:
      • 正则表达式作为模式
        awk '/^oldboy/{print xx}'
      • 利用比较匹配信息
          NR==2
      	NR>=2
          NR<=2
      	NR==2,NR==10
      • 特殊的模式
    	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
        操作结束
    • 统计累加运算测试:
      • 统计/etc/services文件中空行数量
        [root@oldboyedu ~]# awk '/^$/{i=i+1;print i}' /etc/services 
    	[root@oldboyedu ~]# awk '/^$/{i=i+1}END{print i}' /etc/services 
        17
    • 统计/etc/services文件中有井号开头的行
      awk '/^#/{i++}END{print i}' /etc/services

    • 统计系统中有多少个虚拟用户 普通用户

        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}'
  • 相关阅读:
    应用的可被点击与不可被点击
    去掉NavigationBar底部的黑线
    iOS 设计模式之工厂模式
    GCD的用法
    ARC以及MRC中setter方法
    alpha,hidden,opaque的一些认识
    self进行weak化
    iOS之获取当前时间日期并按固定格式显示
    iOS之AVPlayer的简单应用
    Xcode快捷键、小技巧与xib圆角设置
  • 原文地址:https://www.cnblogs.com/chacha51/p/13764839.html
Copyright © 2011-2022 走看看