2019-07-day19

三剑客之awk的基础用法

1.awk命令的概述:
gawk : pattern scanning and processing language
可以进行模式扫描 和 是一门语言
2.awk语法 : awk [参数] '模式{动作}' 文件
sed 语法:sed [参数] '条件 指令' 文件信息
3.awk命令的作用
处理文件信息:文本文件信息 日志文件信息 配置文件信息
处理文件方式: 排除信息 查询信息 统计信息 替换信息
对文件列进行处理

原理图:
QQ图片20190725154253.png

创建测试环境
[root@www ~]# cat reg.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:00
Li Youjiu 918391635 :175:75:300
01.显示xiaoyu的姓氏和ID号码
第一步:找出需要编辑模式信息 获取xiaoyu信息
[root@www ~]# awk '/Xiaoyu/' reg.txt
找出了文件中带xiaoyu的信息
Zhang Xiaoyu 390320151 :155:90:201
Li Youjiu Xiaoyu :175:75:300
[root@www ~]# awk '2~/Xiaoyu/' reg.txt 找出第二列带xiaoyu 的信息 ~这里表示匹配 Zhang Xiaoyu 390320151 :155:90:201 第二步:根据条件做处理 显示满足条件的第三列和第一列信息 awk '2~/xiaoyu/{动作}' reg.txt
awk '1,2~/Xiaoyu/{print 3}' reg.txt
Zhang 390320151

  1. 姓氏是Zhang的人,显示他的第二次捐款金额及他的名字
    第一个步骤: 找出需要编写模式信息
    awk '1~/Zhang/' reg.txt
    Zhang Dandan 41117397 :250:100:175
    Zhang Xiaoyu 390320151 :155:90:201
    第二个步骤: 根据条件做处理
    [root@www ~]# awk '1,4}' reg.txt
    Zhang Dandan :250:100:175
    Zhang Xiaoyu :155:90:201
    默认是以空格分的列 所以会显示第三列会显示所有数值

以冒号划分的列 参数-F 表示以什么划分 比如:以冒号":" 以冒号空格 ": "
awk -F ": " '1,4}' reg.txt
[root@www ~]# awk -F ":" '1,3}' reg.txt 以冒号划分的列
Zhang Dandan 41117397 250 100
Zhang Xiaoyu 390320151 155 90
[root@www ~]# cat reg.txt
第一列 第2列 第三列 第四列
Zhang Dandan 41117397 : 250 :100 :175
Zhang Xiaoyu 390320151 : 155 :90 :201

以冒号和空格划分
awk -F "[: ]+" '1,5}' reg.txt
[: ]+ 表示连续多个分隔符合并成成一个整体
答案:[root@www ~]# awk -F "[: ]+" '1,5}' reg.txt
Zhang Dandan 100
Zhang Xiaoyu 90

  1. 显示所有以41开头的ID号码的人的全名和ID号码
    第一个步骤: 找出需要编写模式信息
    awk '3~/^41/' reg.txt
    Zhang Dandan 41117397 :250:100:175
    Liu Bingbing 41117483 :250:100:175
    第二个步骤: 根据条件做处理
    awk '1,3}' reg.txt
    [root@www ~]# awk '1,3}' reg.txt
    Zhang Dandan 41117397
    Liu Bingbing 41117483
    [root@www ~]# awk '1,3}' reg.txt|column -t column -t :对齐显示
    Zhang Dandan 41117397
    Liu Bingbing 41117483
  2. 显示所有ID号码最后一位数字是1或5的人的全名
    第一个步骤: 找出需要编写模式信息
    找出第三列以1或5结尾的信息
    方法一:[root@www ~]# awk '|53~/[15]3~/(1|5)3~/1/{print 2}' reg.txt
    答案:[root@www ~]# awk '|51,3~/[15]1,$2}' reg.txt
    Zhang Xiaoyu
    Wu Waiwai
    Wang Xiaoai
    Li Youjiu
  3. 获取文件中有井号或空行的内容, 将空行和井号信息的行排除
    第一个步骤: 找出需要编写模式信息
    awk '/#|^/' reg.txt

‘ #Wu Waiwai 70271111 :250:80:75
' #Wang Xiaoai 3515064655 :50:95:135

[root@www ~]# cat reg.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
方法二:[root@www ~]# awk '/' reg.txt

/#Wu Waiwai 70271111 :250:80:75
/#Wang Xiaoai 3515064655 :50:95:135
说明: $0 表示将文件所有列信息进行显示

awk '!/#|^/' reg.txt !表示取反 就是除去#号和空行 都显示出来 第二个步骤: 根据条件做处理 答案 :[root@www ~]# awk '!/#|^/' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300
方法二:[root@www ~]# awk '/{print $0}' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300

  1. 显示Xiaoyu的捐款,每个捐款数额都是以110330
    awk '4}' reg.txt|sed 's#:#2~/Xiaoyu/{print #g'
    902~/Xiaoyu/{print "4,"5,"6}' reg.txt
    90 将第几列)
    操作:[root@www ~]# awk '",NF}' reg.txt
    90NF 表示文件的最后一列信息
  2. awk命令模式分类
    普通模式: 比较行信息
    [root@www ~]# cat reg.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:00
    Li Youjiu 918391635 :175:75:300
    Li Youjiu Xiaoyu :175:75:300

[root@www ~]# awk 'NR>2' reg.txt 显示大于2行的信息

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:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300

[root@www ~]# awk 'NR<2' reg.txt 显示小于2行的信息
Zhang Dandan 41117397 :250:100:175
说明: NR 表示文件行信息

取出多行信息
[root@www ~]# awk 'NR==2,NR==4' reg.txt
连续多行信息
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75

[root@www ~]# awk 'NR==2;NR==4' reg.txt
不连续多行 指定行的信息
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75

特殊模式:
BEGIN{动作}: 在处理文件之前,先做什么事情
[root@www ~]# awk 'BEGIN{print "姓","名","号码","捐款记录"}{print 0}' reg.txt|column -t 姓 名 号码 捐款记录 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:00 Li Youjiu 918391635 :175:75:300 Li Youjiu Xiaoyu :175:75:300 用于计算: [root@www ~]# awk (NF-1)}' reg.txt --- 取出倒数第二列
NR: 表示行信息
FS: 指定列分隔符, 默认识别空格为分割符
[root@www ~]# awk 'BEGIN{FS="[: ]+"}{print 1,4}' reg.txt Zhang 250 Zhang 155 Meng 250 Wu 250 Liu 250 Wang 50 Zi 00 Li 175 Li 175 END{动作}: 在处理文件之后,再做什么事情 [root@www ~]# awk 'BEGIN{print 0}END{print "学生捐款登记表"}' reg.txt|column -t
姓 名 号码 捐款记录
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:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300
学生捐款登记表
实际作用:
可以将统计后的最终结果进行输出

  1. awk对文件进行统计分析

    1. awk统计运算公式
      a 文本信息累加运算
      i=i+1
      统计文件行数
      awk '{i=i+1}END{print i}' test.txt
      [root@www ~]# awk '/oldboy/{i=i+1}END{print i}' reg.txt
      9
      [root@www ~]# awk '/oldboy/{i++}END{print i}' reg.txt
      9
      数值信息求和运算
      sum=sum+n 你要对文件第几列信息做求和运算

    seq 10|awk '{sum=sum+$1}END{print sum}'

    55

    找出有faild信息, 总共出现了多少次 (awk统计)
    难点: windows文件如何传输到linux系统
    yum install -y lrzsz --- 实现windows和linux系统之间数据传输
    rz -- 将windows数据 ---> linux系统
    sz -- 将linux数据 ---> windows系统

    awk '/Failed/{i++}END{print i}' secure-20161219
    awk '$6~/Failed/{i++}END{print i}' secure-20161219'

课程知识重点
1) awk命令概念介绍: 语法 原理 BEGIN 处理文件 END
2) awk命令操作说明: 作用 查询 排除 替换
参数:
-F : 指定列分割符号
-v : 指定变量信息
动作:
print : 输出指定信息
gsub : 替换指定信息
符号:
~ : 匹配信息 按照指定列进行匹配
!~ : 将匹配的信息取反
// : 指定匹配信息
3) awk命令模式分类
BEGIN{}: 处理文件前, 执行什么动作
END{}: 处理文件后, 执行什么动作
内置变量: FS NF NR --n

你可能感兴趣的:(2019-07-day19)