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}'
原文地址:https://www.cnblogs.com/chacha51/p/13764839.html