zoukankan      html  css  js  c++  java
  • Linux awk命令 --三剑客老大

    Linux awk命令 --三剑客老大

    基本用法:

      awk  [参数]  ['找谁{干啥}']  文件

    参数:

      -F  分隔符

      -v  创建或修改awk变量

        OFS  输出分割符 awk显示每一列的时候分隔

    '找谁{干啥}'

      找谁==条件

        比较表达式:
          ==  等于
          >=  大于等于
          <=  小于等于
          >   大于
          <   小于
        注:如果列不止数字,想只比较数字的话。可以用+0方法。eg:'$5+0>10'

        正则表达式:
          ~    表示包含或匹配
            示例:awk '$1~//dev/sda1/{print $2,$NF}' df.txt
          !~   不包含或不匹配
          正则

            ^  是哪一列的开头
            $  是哪一列的结尾

        范围:
          ‘NR==1,NR==5’      第1行到第3行
          '$3==0,$3==1000'     第3列等于0到第3列等于1000
          '/那个字符/,/到那个字符/'
        注:不贪婪匹配,但可以匹配多次

        特殊:
          &&       并且
          ||        或者
          BEGIN{}       BEGIN 里面的内容会在awk读取文件之前执行
          END{}        awk读取文件内容之后执END内容

      {干啥==动作}
        默认 '{print $0}'
          $0  显示整行
          $num  显示第num列
          $NF    显示最后一列
          $(NF-1)    显示倒数第2列
          NR      显示行号
        gsub()
          条件:gsub(/找谁/,"替换为",哪一列)
        注:有两个动作以上,需要用;分割

    例题:

    1.显示/etc/passwd及行号

    [root@maintain data]# awk -F':' '{print NR,$0}' /etc/passwd
    1 root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6 sync:x:5:0:sync:/sbin:/bin/sync
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8 halt:x:7:0:halt:/sbin:/sbin/halt
    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10 operator:x:11:0:operator:/root:/sbin/nologin
    11 games:x:12:100:games:/usr/games:/sbin/nologin
    12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13 nobody:x:99:99:Nobody:/:/sbin/nologin
    14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    15 dbus:x:81:81:System message bus:/:/sbin/nologin
    16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    17 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    19 ntp:x:38:38::/etc/ntp:/sbin/nologin

    2.显示/etc/passwd 第1列,第3列 倒数二列和最后一列

    [root@maintain data]# awk -F':' '{print $1,$3,$(NF-1),$NF}' /etc/passwd
    root 0 /root /bin/bash
    bin 1 /bin /sbin/nologin
    daemon 2 /sbin /sbin/nologin
    adm 3 /var/adm /sbin/nologin
    lp 4 /var/spool/lpd /sbin/nologin
    sync 5 /sbin /bin/sync
    shutdown 6 /sbin /sbin/shutdown
    halt 7 /sbin /sbin/halt
    mail 8 /var/spool/mail /sbin/nologin
    operator 11 /root /sbin/nologin
    games 12 /usr/games /sbin/nologin
    ftp 14 /var/ftp /sbin/nologin

    3.显示出/etc/passwd中 第3列大于80的行
    条件:第3列大于80
        $3>80
    动作:不写(默认{print $0})

    [root@maintain data]# awk -F':' '$3>80' /etc/passwd
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    4.显示磁盘使用率 大于10% 的磁盘分区和挂载点(目录)

    条件:使用率大于10
        $5>10
    动作:显示磁盘分区和挂载点
        print $1,$NF

    [root@maintain data]# df | awk '$5+0>10' 
    /dev/sda2        10G  1.4G  8.7G  14% /
    /dev/sda1       497M  117M  381M  24% /boot

    5.创建一个test文本,包括以下内容:

    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 918691635 :250:100:175

    说明:第1列是姓,第2列是名字,第3列是ID,第4列是三次捐款

    a.显示所有以一个D或X开头的人名全名
    条件:名字以D或X开头
      $2~/^[DX]/
    动作:显示全名
      print $1,$2

    [root@maintain data]# awk '$2~/^[DX]/{print $1,$2}' reg.txt 
    Zhang Dandan
    Zhang Xiaoyu
    Wang Xiaoai

    b.显示所有ID号码最后一位数字是1或5的人的全名
    条件:ID号码最后一位数字是1或5
        $3~/[15]$/
    动作:显示全名
        print $1,$2

    [root@maintain data]# awk '$3~/[15]$/{print $1,$2}' reg.txt 
    [root@maintain data]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt 
    [root@maintain data]# awk '$3~/1$|5$/{print $1,$2}' reg.txt 
    Zhang Xiaoyu
    Wu waiwai
    Wang Xiaoai
    Li Youjiu
    Lao Nanhai

    c.显示Xiaoyu的捐款,每个值时都有以$开头,如$520$200$135
    gsub(/找谁/,"替换为",哪一列)
    条件:Xiaoyu的
      $2~/Xiaoyu/
    动作:捐款每个值以$开头
      gsub(/:/,"$",$NF)

    [root@maintain data]# awk '$2~/Xiaoai/{gsub(/:/,"$",$NF);print $0}' reg.txt 
    Wang Xiaoai 3515064655 $50$95$135

    d.显示所有人的全名,以姓,名的格式显示,如Meng,Feixue
    条件:无
    动作:姓与名有个,连接
        ','

    [root@maintain data]# awk '{print $1","$2}' reg.txt         #双引号,引住的就是原输出
    [root@maintain data]# awk -v OFS=',' '{print $1,$2}' reg.txt  #OFS 输出分割符 awk显示每一列的时候分隔符
    Zhang,Dandan 
    Zhang,Xiaoyu
    Meng,Feixue
    Wu,waiwai
    Liu,Bingbing
    Wang,Xiaoai
    Zi,Gege
    Li,Youjiu
    Lao,Nanhai

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

    [root@maintain data]# awk '/^$/{i++}END{print i}' /etc/services 
    17
  • 相关阅读:
    函数part1 初始函数
    文件操作 文件修改的两种方式
    文件操作part3 文件内指针的移动
    文件操作part2
    day08作业
    文件操作part1
    字符编码
    ORA-15124 数据库启动阶段报错
    将数据库从普通文件系统迁移到ASM中
    在ASM中移动数据文件
  • 原文地址:https://www.cnblogs.com/mycloudedu/p/11601991.html
Copyright © 2011-2022 走看看