• 三大搜索利器 -- awk


    awk 的特点


      文本与数据的处理工具; 可编程: 处理灵活, 功能强大;

    awk 应用


    • 统计
    • 制表

    awk 处理方式 与 格式


    awk 处理方式

    • awk 一次处理一行内容;
    • awk 对每行可以切片处理;
      • awk '{print $1}'         # 打印输出首个单词, 默认是空格分割;

    awk 格式

    • 命令行格式
      • awk [options] 'command' file(s)
        • command : pattern {awk操作命令}
        • pattern : 正则表达式, 逻辑判断式
        • 操作命令可用:
          • 内置函数 : print()  printf()  getline...;
          • 控制指令 : if () {...} else {...}; while () {...};
    • 脚本格式
      • awk -f awk-script-file file(s)

    awk 内置参数的应用


    • awk 内置变量 (1)
      • $0 : 表示当前行;
      • $1 : 表示第一个字段;
      • $2 : 表示第二个字段;
      • ... ...
    • awk 内置参数 : 分隔符
      • options : -F field-swparator ( 若不指定的话, 默认使用空格作为 分隔符 );
      • 示例: awk -F ":" '{print $3}' /etc/passwd            # 以 : 分割, 打印第三个字段;
    • awk 内置变量 (2)
      • NR : 每行的记录号 ( 每行的行号 );
      • NF : 字段数量变量 ( 字段中字段的种数 );
      • FILENAME: 正在处理的文件名;
    • 使用案例
      • // awk 打印多个内容;
        awk -F ":" '{print $1,$3}' passwd            // 使用逗号分隔,打印的内容以空格分隔;
            ... ...
            tian 502
        
        awk -F ":" '{print $1"------"$3}' passwd    // 使用指定的符号进行分隔;
            ... ...
            tian------502
        
        awk -F ":" '{print "UserName:"$1"  ""UUID:"$3}' passwd        // 添加相应内容的说明;
            ... ...
            UserName:tian  UUID:502
        
        // awk 使用 NR , NF , FILENAME 参数;
        awk -F ":" '{print NR,NF}' passwd            // 使用 NR 打印行号, NF 打印多少个字段;
            ... ...
            27 7
            28 7
        
        awk -F ":" '{print FILENAME}' passwd        // 每行都打印处理的文件名;
            ... ...
            passwd
            passwd
            
        // ****************************** 案例 一 **********************************
        ''' 显示 passwd 每行的行号, 每行的列数, 对应行的用户名, 使用 print 和 printf() 两种方法实现 '''
        awk -F ":" '{print NR"  "NF"  "$1}' passwd            // 使用 print;
            ... ...
            27  7  zxjr
            28  7  tian
        
        awk -F ":" '{printf("%2s %s %s
        ",NR,NF,$1)}' passwd        // 使用 printf() 函数;
            ... ...        // 2 表示占用的字符数, 使打印更整齐;
            27  7  zxjr
            28  7  tian
            
        // ******************************* 案例 二 **********************************
        ''' 显示 passwd 中用户 ID 大于100 的行号和用户名 (使用  if ... else ...)'''
        awk -F ":" '{if ($3>100) print NR"  "$1}' passwd
            ... ...
            27  zxjr
            28  tian
            
        // ******************************* 案例 三 **********************************
        ''' 在服务器 log 中找出 'Error' 的发生日期'''
        sed -n '/Error/p' /var/log/messages |awk '{print $1,$2,$3}'            // 方法一;
        
        awk '/Error/ {print $1,$2,$3}' /var/log/messages                       // 方法二;

    awk 逻辑判断


    •  ~ , !~ : 匹配正则表达式;
    • == , != , < , > : 判断逻辑表达式;
    // 匹配 $1 是以 t 开头的行;
    awk -F ":" '$1~/^t.*/ {print $1}' passwd
        tian
    // 匹配 $1 不以 t 开头的行;
    awk -F ":" '$1!~/^t.*/ {print $1}' passwd
        root
        ... ...
    // 判断 UUID 大于 500 的输出用户名;
    awk -F ":" '$3>500 {print $1}' passwd 
        zxjr
        tian
    // 判断 UUID 等于 502 的输出用户名;
    awk -F ":" '$3==502 {print $1}' passwd 
        tian
    // 使用冒号或空格作为分隔符
    netstat -anpt |grep -v grep |grep sshd |grep LISTEN |grep "tcp " |awk -F "[: ]+" '{print $5}'

    awk -- 扩展格式


    •  command 扩展
    • 格式: BEGIN{print "start"} pattern{commands} END {print "end"}
    // 制表显示 passwd 每行的行号, 每行的列数, 对应行的用户名
    awk -F ":" 'BEGIN{print "Line   Col   User"}{print NR"      "NF"      "$1}END{print "------"FILENAME"------"}' passwd 
        Line   Col   User
        1      7      root
        2      7      bin
        ... ...
        10      7      uucp
        ... ...
        ------passwd------
    
    // 比较美观的写法;
    awk -F ":" 'BEGIN{print "Line      Col      User"}{printf("%2s%10s%s%s
    ",NR,NF,"       ",$1)}END{print "------"FILENAME"------"}' passwd
        ... ...
        Line      Col      User
         1         7       root
         2         7       bin
        ... ...
        10         7       uucp
        ... ...
        ------passwd------

    awk -- 案例


    // ***************************** 案例 一 ********************************
    ''' 统计当前文件夹下的 文件/文件夹 占用的大小 '''
    // 定义 size 变量, size 累加文件及目录的大小, 打印总和;
    ls -l |awk 'BEGIN{size=0}{size+=$5}END{print " Size is: "size}'
     Size is: 1024038984
    // 添加单位, 进行换算;
    ls -l |awk 'BEGIN{size=0} {size+=$5} END{print " Size is: "size/1024"M"}'
     Size is: 1.00004e+06M
     
    // ***************************** 案例 二 ********************************
    ''' 统计显示 passwd 的账户总人数 ( 要考虑空行的可能 ) '''
    // 开始, 定义计数器, 匹配排除空行, 自加一, 结束, 打印总数;
    awk 'BEGIN{count=0} $1!~/^$/{count++} END{print " Totle: "count}' passwd 
     Totle: 28
     
    // ***************************** 案例 三 ********************************
    ''' 统计显示 passwd 文件中 UUID 大于 100 的用户 '''
    // 定义计数器, 判断 UUID 大于 100; 定义一个数组, 将值与用户对应, 使用 for 循环打印用户名;
    awk -F ":" 'BEGIN{count=0} {if ($3>100) name[count++]=$1} END{for (i=0;i<count;i++) print i,name[i]}' passwd
        0 abrt
        1 saslauth
        2 nginx
        3 zxjr
        4 tian
        
    // ****************************** 案例 四 ********************************
    ''' 统计 netstat -anp 状态下为 LISTEN 和 CONNECTED 的连接数量 '''
    // 定义计数器, 判断状态行等于两种状态时, 计数器自加一, 打印总数;
    netstat -anp |awk 'BEGIN{count=0} {if ($6=="LISTEN"||$6=="CONNECTED") count++} END{print " Connect Totle: "count}'
     Connect Totle: 68
    // 状态行匹配两种状态的其中一种,匹配到哪种, 哪种自加一, 使用 for 循环打印;
    netstat -anp |awk '$6~/CONNECTED|LISTEN/ {sum[$6]++} END{for (i in sum) print " ",i,sum[i]}'
      CONNECTED 64
      LISTEN 4

    awk 总结


                   

  • 相关阅读:
    JavaScript递归函数解“汉诺塔”
    《JavaScript DOM编程艺术》学习笔记(三)
    《JavaScript DOM编程艺术》学习笔记(二)
    《JavaScript DOM编程艺术》学习笔记(一)
    《手把手教你实现电商网站开发》课程学习总结
    学校水卡、本地公交卡破解记
    第一篇博客
    mysql5.7.5以上版本使用distinct和order by 报错备忘录
    group_concat长度限制踩坑备忘录
    ArrayList、LinkedList、Vector的区别
  • 原文地址:https://www.cnblogs.com/haorong/p/10727525.html
Copyright © 2020-2023  润新知