• linux三剑客-awk


    第1章 awk指哪打哪

    1.1 awk内置变量

    FS 

    输入字段(列)分隔符

    -F :

    相当于-vFS :

    NR 

    number of record 行号(记录号)

    NF  

    number of filed  每行有多少列

    OFS

    output 输出分隔符

    RS 

    record separator 记录分隔符每一的结束标记 默认是回车

    IGNORECASE

    是否忽略大小写  1为忽略

    1.1.1 RS    记录分隔符   每一的结束标记默认是回车

    [root@zeq files]# cat passwd.txt
    
    root:x:0:0:root:/root:/bin/bash
    
    bin:x:1:1:bin:/bin:/sbin/nologin     默认结束标记是回车,现在文件内容为两行

    以/作为记录分隔符,显示行号和文件内容

    [root@zeq files]# awk -vRS="/" '{print NR,$0}' passwd.txt   NR是显示行号   $0是显示一整行的内容
    
    1 root:x:0:0:root:
    2 root:
    3 bin
    4 bash
    bin:x:1:1:bin:
    5 bin:
    6 sbin
    7 nologin               现在以/为记录分隔符就变成了7行
    
    这里的awk -vRS="/"     -v给变量赋值,RS是awk内置变量,设置/为记录分隔符

    1.2 awk中表示行和列

    NR==1

    第一行

    $1

    第一列

    $NF

    最后一列

    $NF-1

    倒数第二列

    1.3 awk模式匹配(条件)

    模式-pattern  帮助你找到想要的行

    1)正则表达式

    2)比较

       >

       <

       ==

    3)范围

    4)BEGIN{} END{}

    1.4 正则表达式

    ~

    某一列中包含xxx

    !~

    某一列中不包含xxx

    ^

    以....开头的字符(列)

    $

    以....什么结尾的

    .*

    所有

    ^$

    空行

    转义字符 backslash  脱掉马甲打回原形

    []

    匹配[]的每一个字符

    +

    一个字符出现1次或1次以上

    |

    或者

    ()

    反向引用,一个整体,保护里面的内容

    *

    一个字符出现0次或者0次以上

    {}

    0{n,m} 数字0连续出现了至少n次,最多m次

    ?

    一个字符出现0次或1次

    1.4.1 awk正则表达式练习

    创建环境

    mkdir -p /server/files/
    
    cat >>/server/files/reg.txt<<EOF
    Zhang Dandan    41117397   :250:100:175             第一列是姓氏
    Zhang Xiaoyu    390320151  :155:90:201              第二列是名字
    Meng  Feixue    80042789   :250:60:50               第一第二列合起来就是姓名
    Wu    Waiwai    70271111   :250:80:75               第三列是对应的ID号码
    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
    EOF

    1.4.2 取出第3列中以数字4开头的行

    [root@zeq files]# awk '$3~/^4/' reg.txt    $3 第3列   ~ 包括    ^4 以4开头
    
    Zhang Dandan    41117397   :250:100:175
    Liu   Bingbing  41117483   :250:100:175

    1.4.3 显示Xiaoyu的姓氏和ID号码

    [root@zeq files]# awk ' $2~/Xiaoyu/{print $1,$3}' reg.txt  
    
    Zhang 390320151

    1.4.4 显示所有以41开头的ID号码的人的全名和ID号码

    [root@zeq files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
    
    Zhang Dandan 41117397
    Liu Bingbing 41117483

    awk默认动作

    [root@zeq files]# awk  '$3~/^41/' reg.txt
    
    Zhang Dandan    41117397   :250:100:175
    Liu   Bingbing  41117483   :250:100:175
    [root@zeq files]# awk  '$3~/^41/{print }' reg.txt
    
    Zhang Dandan    41117397   :250:100:175
    Liu   Bingbing  41117483   :250:100:175

    1.4.5 显示所有ID号码最后一位数字是1或5的人的全名

    方法1
    
    [root@zeq files]# awk '$3~/[15]$/{print $1,$2}' reg.txt     []匹配里面的1和5    $表示以...结尾
    
    Zhang Xiaoyu
    Wu Waiwai
    Wang Xiaoai
    Li Youjiu
    Lao Nanhai
    方法2
    
    [root@zeq files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt     |或者   1或者5
    
    Zhang Xiaoyu
    Wu Waiwai
    Wang Xiaoai
    Li Youjiu
    Lao Nanhai

    1.4.6 显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135

    [root@zeq files]# awk -F: -vOFS=$ '/Xiaoyu/{print "$"$2,$3,$4}' reg.txt
    
    $155$90$201          -F指定:为分隔符    -vOFS=$输出$为分隔符   

    1.5 awk替换

    gsub  awk内置函数

    1.5.1 格式  

    gsub(/要替换的内容/,"替换成什么",替换的部分)

    1.5.2 接“显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135”这一题

    [root@zeq files]# awk '{gsub(/:/,"$"); print}' 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 $250$168$200
    Li    Youjiu    918391635  $175$75$300
    Lao   Nanhai    918391635  $250$100$175

    加上条件精确到哪一部分

    [root@zeq files]# awk '$2~/Xiaoyu/{gsub(/:/,"$"); print $NF}' reg.txt     $NF最后一列
    
    $155$90$201

    1.6 范围

    1、从第1行到第5行内容

    awk  'NR==1,NR==5'

    2、从包含某个内容的行到包含某个内容的行

    awk  '/内容/,/内容/'

    1.6.1 显示从第1行到第5行内容

    [root@zeq files]# awk 'NR==1,NR==5' 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

    1.6.2 显示包含Xiaoyu到包含Waiwai的行

    [root@zeq files]# awk '/Xiaoyu/,/Waiwai/' reg.txt
    
    Zhang Xiaoyu    390320151  :155:90:201
    Meng  Feixue    80042789   :250:60:50
    Wu    Waiwai    70271111   :250:80:75

    1.7 比较表达式

    $5>500                第五列大于500
    
    NR>20                 大于第20行的行,20行以后
    
    >  
    
    >=
    
    ==
    
    !=                    不等于
    
    <=
    
    < 

    1.7.1 查看磁盘信息 df -h

    [root@zeq files]# df -h
    
    Filesystem      Size  Used Avail Use% Mounted on
    
    /dev/sda3        19G  7.8G   10G  44% /
    
    tmpfs           491M     0  491M   0% /dev/shm
    
    /dev/sda1       190M   61M  120M  34% /boot
    
    /dev/sdb1       193M  1.8M  181M   1% /data

    1.7.2 显示出磁盘使用率大于20%的磁盘分区名称和挂载点(错误范例)

    [root@zeq files]# df -h|awk '$5>20{print $1,$NF}'  
    
    Filesystem on
    
    /dev/sda3 /
    
    /dev/sda1 /boot
    
    [root@zeq files]# df -h|awk '$5>9{print $1,$NF}'   这里会默认$5>9是字符串(字母)而不是比较表达
    
    Filesystem on

    1.7.3 解决方法1     指定分隔符只保留数字部分

    [root@zeq files]# df -h|awk -F"[% ]+" '$5>9{print $1,$NF}'   
    
    Filesystem on
    
    /dev/sda3 /
    
    /dev/sda1 /boot

    想要去掉第一列Filesystem on信息

    [root@zeq files]# df -h|awk 'NR>1 && $5+0>9{print $1,$NF}'   第1行以后(&&并且)
    
    /dev/sda3 /
    
    /dev/sda1 /boot

    1.7.4 解决方法2    某一列+0

    [root@zeq files]# df -h|awk '$5+0>9{print $1,$NF}'    第5列做比较,第5列加0
    
    /dev/sda3 /
    
    /dev/sda1 /boot

    1.8 特殊模式 BEGIN{}  END{}

    1)awk执行的过程

      1.执行命令的参数(赋值) -F -v

         2.BEGIN{} 里面的内容 (awk还没有开始读取文件内容)

         3.读取文件内容

            判断是否满足条件(模式)

            符合 执行命令(动作)

            不符合  读取下一行直到最后一行

         4.文件内容读取完成后,开始执行END{}里面的内容

     2)BEGIN{}   里面的内容会在 awk读取文件内容之前执行

            1.显示标题

            2.修改awk内置变量 创建变量

               awk 'BEGIN{OFS=:}'  相当于 awk -vOFS=:

            3.测试 计算

    3)END{}   awk读取完文件之后 执行

            显示计算结果

            先计算,END显示结果

    1.8.1 统计passwd.txt中虚拟用户的数量

    [root@zeq files]# cat passwd.txt         查看文件虚拟用户为nologin
    
    root:x:0:0:root:/root:/bin/bash
    
    bin:x:1:1:bin:/bin:/sbin/nologin
    
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    sync:x:5:0:sync:/sbin:/bin/sync
    
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    
    halt:x:7:0:halt:/sbin:/sbin/halt
    
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    统计数量

    [root@zeq files]# awk  '/nologin$/{i=i+1}END{print i}' passwd.txt      i=i+1相当于i++
    
    6

    1.8.2 统计/etc/services 文件中空行的数量

    [root@zeq files]# awk '/^$/{i++}END{print i}' /etc/services
    
    16

    1.9 awk动作

    print

    gsub 函数 (命令)

    变量 计算

    1.9.1 计算磁盘使用率

    [root@zeq files]# df
    
    Filesystem     1K-blocks    Used Available Use% Mounted on
    
    /dev/sda3       19534104 8076500  10458644  44% /
    
    tmpfs             502056       0    502056   0% /dev/shm
    
    /dev/sda1         194241   62009    121992  34% /boot
    
    /dev/sdb1         197209    1813    185003   1% /data
    [root@zeq files]# df |awk 'NR>1{print $3/$2}'            
    
    0.413456
    
    0
    
    0.319237
    
    0.00919329

    1.9.2 查看内存信息   free    free -h

    [root@zeq files]# free
    
                 total       used       free     shared    buffers     cached
    
    Mem:       1004112     806016     198096        236     101452     563232
    
    -/+ buffers/cache:     141332     862780
    
    Swap:       786428        420     786008

    1.9.3 计算系统内存的使用率

    [root@zeq files]# free |awk '/Mem/{print ($3-$6-$7)/$2}'
    
    0.140705
    
    [root@zeq files]# free|awk 'NR==3{print $3/($3+$4)}'
    
    0.140705

    1.9.4 计算系统内存的剩余率

    [root@zeq files]# free|awk 'NR==3{print $4/($3+$4)}'
    
    0.859211

    1.9.5 设置变量计算系统内存的使用率和剩余率

     [root@zeq files]# free|awk 'NR==3{sum=$3+$4;print $3/sum,$4/sum}'    sum为变量
    
    0.140765 0.859235
  • 相关阅读:
    Summary for sql join in Oracle DB
    Merge data into table in Oracle
    PLSQL存储过程传出大量异常错误信息
    oracle 11g plsql解析json数据示例
    识别'低效执行'的SQL语句
    如何开启MySQL 5.7.12 的二进制日志
    Linux下ps命令详解 Linux下ps命令的详细使用方法
    Linux(Unix)时钟同步ntpd服务配置方法
    MySQL 常用命令总结
    MySQL 数据库通过日志恢复
  • 原文地址:https://www.cnblogs.com/zeq912/p/9519794.html
Copyright © 2020-2023  润新知