awk详解及使用demo

awk:擅长统计分析文件内容,对文件中的列进行操作
作用特点
  • 排除信息
  • 查询信息
  • 统计信息
  • 替换信息
语法格式
awk [参数] '模式-动作' 文件
替换格式
gsub(/需要替换的信息/,"修改成什么信息",对第几列进行修改)
总结:awk命令中$符号的用法
  • $1,$2:取第1列信息和第二列信息
  • $NF:取最后一列
  • $(NF-1):取倒数第二列
  • $0:取所有列信息
查询
  • 按照行号查询信息

    #查询第二行数据
    awk 'NR==2' 1.txt
    
    #查询第二行到第四行数据
    awk 'NR==2,NR==4' 1.txt
    
    #查询第二行和第四行数据
    awk 'NR==2;NR==4' 1.txt
    
  • 按照字符查询信息

    #查询某字符数据
    awk '/old/' 1.txt 
    
    #查询两个字符之间的数据
    awk '/old/,/boy/' 1.txt
    
    #查询两个字符的数据
    awk '/old/;/boy/' 1.txt
    
    #不区分大小写
    [root@pert ~]# awk '/a/' IGNORECASE=1  1.txt 
    as
    Ae
    
  • 显示查询结果的某列

    #查询old行然后取出第一列和第三列,中间以空格隔开
    awk '/old/{print $1,$3}' 1.txt
    
    #查询old行然后取出第一列和第三列,中间以逗号隔开
    awk '/old/{print $1","$3}' 1.txt
    
  • 修改以什么为分隔

    awk '/old/{print $NF}' 1.txt | awk -F ":" '{print $3}'
    
    $NF:最后一列
    $(NF-1):倒数第二列
    $NF-1:最后一列的值-1
    -F:修改以什么为分隔列
    
    组合结果,直接以:为分隔
    awk -F ":" '/old/{print $3}' 1.txt
    
  • 添加间隔符号,并展示多列

    awk -F "[ :]+" '/old/{print $1,$4}'
    
    [ :]+:以空格或者:为分隔,有个+表示就算有多个空格也算一个,这里修改后间隔符有空格、:、空格:三种
    
  • 先找出第三行数据,然后根据第三行的数据找出以41开头的,然后要这些的第一列和第二列的数据

    awk '$3~/^41/{print $1,$2}' 1.txt
    
    ~:这里后面写找出第几列后这列的匹配规则规则
    
  • 先找出第三列,然后根据第三列数据找出以1或5结尾的数据然后要第一列和第二列数据并且结果对齐显示

    awk '$3~/1$|5$/{print $1,$2}' 1.txt | column -5
    
    column -t:显示结果列对齐
    
  • 先找出数据然后修改找出的内容,只是在显示上进行修改

    awk '$2~/old/{gsub(/:/,"$",$NF);print $NF}'
    
文件中空行或注释进行排除
  • grep

    grep -Ev "^#|^$" 1.txt
    
  • sed

    sed -rn '/^#|^$/d' 1.txt
    
  • awk

    awk '$0!~/^#|^$/' 1.txt
    
awk高级功能说明
  • 对日志信息进行统计(计数)
  • 对日志信息数值进行求和。客户端-下载、服务端-上传,都需要消耗网络流量
  • 数组进行排序分析
  • 进行脚本编写循环语句、判断语句
awk模式概念说明:匹配的条件信息
  • 普通模式

    • 正则表达式
      • /^old/
    • 利用比较匹配信息
      • 第二行:NR==2
      • 第二行后:NR>2
      • 第二行前包含第二行:NR<=2
      • 第二行和第四行:NR2;NR4
      • 第二行到第四行:NR2,NR4
  • 特殊模式

    • BEGIN{}:在awk执行命令前做什么事情

      awk 'BEGIN{print "姓名","QQ号","捐款记录"}{print $0}' 1.txt | column -t
      
    • end{}:在awk执行命令后做什么事情

      awk 'BEGIN{print "姓名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' 1.txt | column -t
      
BEGIN
  • 用于计算

    awk 'BEGIN{print 100+22}'
    
  • 修改内置变量

    • FS作用==-F

      awk -F ":" '{print $2}' 1.txt
      等同于
      awk 'BEGIN{FS=':'}{print $2}' 1.txt
      等同于-vFS=':'
      
利用awk公式进行计数运算
i=0
echo $((i=i+1))
或者
echo $(i++)
#统计这个文件中有多少空行
i=0
awk '/^$/{i++;print i}' /etc/services

只显示最后一行结果
awk '/^$/{i++}END{print i}' /etc/services
统计系统中有多少个虚拟用户 普通用户
  • 用户信息都保存在什么文件中

    • /etc/passwd
  • 从文件中匹配出虚拟用户、普通用户

    • 普通用户

      awk '$NF~/\/bin\/bash/' /etc/passwd
      
    • 虚拟用户

      awk '$NF!~/\/bin\/bash/' /etc/passwd
      
  • 进行统计

    awk 'BEGIN{i=0}$NF~/\/bin\/bash/{i++}END{print i}' /etc/passwd
    等价于 可以不用提前设置i
    awk '$NF~/\/bin\/bash/{i++}END{print i}' /etc/passwd
    
  • 求和运算

    seq 10 | awk '{sum=sum+$1;print sum}'
    1
    3
    6
    10
    15
    21
    28
    36
    45
    55
    
    [root@pert ~]# cat 1.txt 
    a 1  :1:2:3
    b 2  :11:22:33
    
    [root@pert ~]# awk -F "[ :]+" 'BEGIN{print "第一次总额","第二次总额"}{sum=sum+$3;sum2=sum2+$4}END{print sum,sum2}' 1.txt | column -t
    第一次总额  第二次总额
    12          24
    

你可能感兴趣的:(linux,运维,服务器)