zoukankan      html  css  js  c++  java
  • awk命令基本使用方法

    awk命令

    基本用法

    awk '{print $1, $4}' netstat.txt

    单引号中大括号的部分就是awk语句

    $1至$n表示第几列,$0表示整行

    格式化输出的方法

    $ awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s ",$1,$2,$3,$4,$5,$6}' netstat.txt

    过滤记录

    $ awk '$3==0 && $6=="LISTEN" ' netstat.txt

    第3列为0,且第6列为LISTEN

    其他的运算符有 !=, >, <, >=, <=

    需要表头可以引入内建变量NR

    $ awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s ",$4,$5,$6}' netstat.txt

    内建变量

    变量 意义
    $0 当前记录(这个变量中存放着整个行的内容)
    $1~$n 当前记录的第n个字段,字段间由FS分隔
    FS 输入字段分隔符 默认是空格或Tab
    NF 当前记录中的字段个数,就是有多少列
    NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中
    FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
    RS 输入的记录分隔符, 默认为换行符
    OFS 输出字段分隔符, 默认也是空格
    ORS 输出的记录分隔符,默认为换行符
    FILENAME 当前输入文件的名字

    指定分隔符

    $ awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd

    BEGIN表示在处理记录之前的操作

    等价于(-F选项)$ awk -F: '{print $1,$3,$6}' /etc/passwd

    如果想指定多个分隔符

    awk -F '[;:]'

    指定输出分隔符

    $ awk -F: '{print $1,$3,$6}' OFS=" " /etc/passwd

    字符串匹配

    $ awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS=" " netstat.txt

    第6列的值包含FIN,/ / 之间是模式

    $ awk '/LISTEN/' netstat.txt

    可以直接像grep一样匹配

    模式取反

    $ awk '$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS=" " netstat.txt

    awk '!/WAIT/' netstat.txt

    拆分文件

    $ awk 'NR!=1{print > $6}' netstat.txt

    按照第6列分割文件,NR!=1表示不处理第1行

    awk 'NR!=1{print $4,$5 > $6}' netstat.txt

    根据第6列分割,输出第4和第5列

    再复杂一点

    $ awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt";
    else if($6 ~ /LISTEN/) print > "2.txt";
    else print > "3.txt" }' netstat.txt
    

    统计

    $ ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'

    统计所有c文件的大小总和,END表示处理记录之后的操作

    $ awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt
    TIME_WAIT, 3
    FIN_WAIT1, 1
    ESTABLISHED, 6
    FIN_WAIT2, 3
    LAST_ACK, 1
    LISTEN, 4
    

    统计各个connection状态的用法

    $ ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}'
    dbus, 540KB
    mysql, 99928KB
    www, 3264924KB
    root, 63644KB
    hchen, 6020KB
    

    统计每个用户的进程占了多少内存

    awk脚本

    • BEGIN{执行前的语句}
    • END{处理完所有行后执行的语句}
    • {处理每一行执行的语句}
    $ cat cal.awk
    #!/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 -f cal.awk score.txt

    或者./cal.awk score.txt

    环境变量

    -v参数或者ENVIRON,其中ENVIRON需要export

    $ awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS=" " score.txt

    几个例子

    #从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?"
    ":"	")}'
    
    
  • 相关阅读:
    BZOJ 2456: mode
    替罪羊树(模板)
    LUOGU P4168 [Violet]蒲公英
    洛谷题目统计爬虫
    LUOGU P3819 松江1843路
    bzoj 2946 [Poi2000]公共串——后缀自动机
    bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机
    bzoj 2555 SubString——后缀自动机+LCT
    洛谷 3804 【模板】后缀自动机
    洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT
  • 原文地址:https://www.cnblogs.com/logchen/p/10403071.html
Copyright © 2011-2022 走看看