加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

三大搜索利器 -- awk

发布时间:2020-12-14 01:34:22 所属栏目:Linux 来源:网络整理
导读:awk 的特点 文本与数据的处理工具; 可编程: 处理灵活,功能强大; ? awk 应用 ? 统计 制表 等 ? awk 处理方式 与 格式 ? awk 处理方式 awk 一次处理一行内容; awk 对每行可以切片处理; awk ‘{print $1}‘ ?????? # 打印输出首个单词,默认是空格分割; ? 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 %sn",NR,$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,$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

?

?

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%sn","       ",$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 总结


???????????????

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读