• Linux命令学习之awk


    • 输出netstat命令的第一列和第四列
    netstat | awk '{print $1 $4}' 
    
    • awk命令中语句被单引号中的大括号括着(只能被单引号包含)
    • $1...$n表示第几列,$0表示整行
    • awk可以进行格式输出
    netstat | awk '{printf "%-8s %-8s
    ",$1,$2}'
    
    • awk可用来过滤记录,比如过滤条件为:第三列值为0&第六列值为LISTEN
    awk '$3==0 && $6=="LISTEN"'
    
    • 需要保留表头可以引入内建变量NR
    awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-8s %-20s",$1,$5}' netstat.txt
    
    • awk中的内建变量
    变量名 说明
    $0 当前记录行
    $1~$n 当前记录的第n个字段,字段间隔由FS分隔
    FS 字段分隔符,默认是空格或tab
    NF 当前记录行的字段数
    NR 行号,从1开始
    FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
    RS 行分隔符,默认为换行符
    OFS 输出的字段分隔符,默认空格
    ORS 输出的行分隔符,默认换行符
    FILENAME 当前输入文件的名字
    • awk指定分隔符
    netstat | awk 'FS=":" {print $1,$3,$6}'
    netstat | awk -F: '{print $1,$3,$6}'
    //多个分隔符可以用-F '[;:]'指定
    
    • awk可以像grep一样去进行字符串匹配
    netstat | awk '/LISTEN/'   //匹配包含LISTEN
    netstat | awk '/FIN|TIME/' //匹配包含FIN或TIME
    netstat | awk '!/LISTEN/'  //匹配不包含LISTEN
    netstat | awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$1,$4,$6} OFS="	"' //第六列模式匹配,~表示模式开始
    netstat | awk '$6 !~ /LISTEN/ || NR==1 {print NR,$1,$4,$6} OFS="	"' //匹配第六列不包含
    
    • awk拆分文件
    awk 'NR!=1{print > $6}' netstat.txt //按照第六列拆分文件,文件名问第六列的值
    awk 'NR!=1{print $4,$5 > $6}' netstat.txt //拆分文件时,只输出指定列
    awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt" }' netstat.tx //更加复杂的拆分
    
    • awk统计信息
    ls -l  *.cpp *.c *.h | awk '{sum+=$5} END {print sum}' //统计所有C、CPP、H文件的文件大小总和
    awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt //统计所有connection状态
    ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}' //统计每个用户进行占了多少内存
    
    • awk可以作为一种语言来编写脚本。
      • BEGIN{执行前的语句}
      • END{处理所有行后要执行的语句}
      • {执行中每一行需要处理的语句}
    • 现有文件score.txt和awk脚本cal.awk
    Marry   2143 78 84 77
    Jack    2321 66 78 45
    Tom     2122 48 77 71
    Mike    2537 87 97 95
    Bob     2415 40 57 62
    
    #!/bin/awk -f
    #运行前
    BEGIN {
        math = 0
        english = 0
        computer = 0
        printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    "
        printf "---------------------------------------------
    "
    }
    #运行中
    {
        math+=$3
        english+=$4
        computer+=$5
        printf "%-6s %-6s %4d %8d %8d %8d
    ", $1, $2, $3,$4,$5, $3+$4+$5
    }
    #运行后
    END {
        printf "---------------------------------------------
    "
        printf "  TOTAL:%10d %8d %8d 
    ", math, english, computer
        printf "AVERAGE:%10.2f %8.2f %8.2f
    ", math/NR, english/NR, computer/NR
    }
    
    • 执行awk脚本命令
    awk -f cal.awk score.txt
    NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    ---------------------------------------------
    Marry  2143     78       84       77      239
    Jack   2321     66       78       45      189
    Tom    2122     48       77       71      196
    Mike   2537     87       97       95      279
    Bob    2415     40       57       62      159
    ---------------------------------------------
      TOTAL:       319      393      350
    AVERAGE:     63.80    78.60    70.00
    
    • 几个小栗子
    #从file文件中找出长度大于80的行
    awk 'length>80' file
    
    #按连接数查看客户端IP
    netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
    
    #打印99乘法表
    seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"
    ":"	")}' 
    
  • 相关阅读:
    redux-simple 简化版的redux
    react服务端渲染(同构)
    使用systemd管理程序进程
    使用Dockerfile构建镜像
    centos7使用supermin制作centos7的docker镜像包
    DNS-dnsmasq安装配置
    kubernetes-部署(单机,使用证书)
    DNS-bind+namedmanager安装
    python3第一个脚本(hello world!)
    Python3 基础语法
  • 原文地址:https://www.cnblogs.com/prelude1214/p/14331133.html
Copyright © 2020-2023  润新知