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}'
  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/chacha51/p/13764839.html
Copyright © 2011-2022 走看看