zoukankan      html  css  js  c++  java
  • Day5-awk

    Awk    编程语言    变量     函数    流程控制    数组    

        单独使用时,主要用来对数据做统计

        统计网站服务 器当天的访问量

        统计网站服务 器在上午9:00-12:00时间 段的访问 量

        统计系统内建用户数据、系统外建用户数

        统计某个服务在某时间段内对CPU、内存的使用率

        和shell脚本一起使用时,获取数据给shell程序处理

       

    命令格式

    Awk    [选项]    '动作'    文件列表

    命令    |Awk    [选项]    '动作'

    -F    "分割符号"    指定列的分割符号

        Awk默认使用    空格    或      ab    做为列的分割符号

    如何处理数据

    以行为处理单位,对数据逐行处理完当前行处理下一行,直到白马 所有行处理完为止,默认把当前行的处理结果输出到屏幕上

       

    Awk变量    内置变量、自定义变量

    内置变量——在调用内置变量时,不需要加 "",输入描述信息时,描述信息加""

    $0    保存当前处理行的内容

       

    FILENAME    保存当前处理文件的文件名

        Awk    '{    print     FILENAME    }'    file1    file2

       

    NR    保存当前处理行的行数

       

    FNR    当前处理行在文件中的行数

        Awk    '{    print     FNR,NR    }'    file1    file2

       

    NF    使用指定的分割符号分割后,行的列数

        Awk    -F    ":"        '{    print     NF    }'    file1

       

    $1……$N    使用指定的分割符号 分割后,对应的值

    Df    -h    |grep         /$ |awk    '{print    $1,$2}'

    FS    保存awk分割感恩节时,使用的分割符号,默认值是    空格 或TAB键

    [root@localhost ~]# head -3 /etc/passwd|awk 'BEGIN{FS=":";print "user uid home"}{print $1" ",$3" ",$6}END{print "this is "NR"..."}

    Awk自定义变量

        Head    /etc/passwd    | awk '{age=10;name="jim";print    name,age}'

        Head    /etc/passwd    | awk '{print    name,age}'

    Awk调用shell自定义变量

        X=100

        Head    -1 /etc/passwd|awk    -v    a=$X'{print    a}'

        Y=200

        Head    -1 /etc/passwd|awk    -v    a=$X    -v    b=$Y'{print    a,b}'

    Awk调用shell系统环境变量

    ENVIRON(数组类型的内置变量)

    ENVIRON["系统环境变量名"]

    主机名    [root@localhost ~]# head -1 /etc/passwd|awk '{print ENVIRON["HOSTNAME"]}'

    用户名    [root@localhost ~]# head -1 /etc/passwd|awk '{print ENVIRON["USER"]}'

    输出3个用户的用户名、UID、家目录

    [root@localhost ~]# head -3 /etc/passwd|awk -F ":" '{print $1" ",$3," "$6}'|sed '1iusername uid home'

    Awk处理数据的顺序

    行前处理    BEGIN{    }    awk没读入之前执行的处理动作

    行处理    {    }    处理文件的每一行

    行后处理    END{    }    awk处理完所有行之后执行的动作

    [root@localhost ~]# head -3 /etc/passwd|awk -F ":" 'BEGIN{print "user uid home"}{print $1" ",$3" ",$6}END{print "this is "NR"..."}'

    Awk处理条件

    Awk    '条件{动作}'    文件名

    条件的表示方式

    数值比较    ==    >    >=    <    <=    !=

    [root@localhost ~]# awk 'FNR==1{print $0}' /etc/passwd

    [root@localhost ~]# awk -F ":" '$3<=10{print $1,$3}' /etc/passwd

    [root@localhost ~]# awk -F ":" '$3==500{print $0}' /etc/passwd

    [root@localhost ~]# awk -F ":" '$3!=0{print $0}' /etc/passwd

    字符比较    ==        !=

    [root@localhost ~]# awk -F ":" '$1=="root"{print $0}' /etc/passwd

    逻辑比较    多个条件

    逻辑与    &&    多个条件要同时成立

    逻辑或    ||    多个条件只要有一个条件成立就可以

    逻辑非    !    取反

    /正则表达式/

    匹配        ~

    不匹配    !~

    值    ~    /正则表达式/

    把系统 账户的UID是3位数用户信息输出

    [root@localhost ~]# awk -F ":" '$3>=100 && $3<=999 {print $0}' /etc/passwd

    [root@localhost ~]# awk -F ":" '$3~/^...$/{print $0}' /etc/passwd

    把系统用户名包含数字的用户的名字和家目录输出

    [root@localhost ~]# awk -F ":" '$1~/[0-9]/{print $1,$6}' /etc/passwd

    输出用户名公由4个字母组成的用户名输出

    [root@localhost ~]# awk -F ":" '$1~/^[a-Z][a-Z][a-Z][a-Z]$/{print $1,$6}' /etc/passwd

    Awk运算符号——和SHELL里面一样的

    使用awk输出文件中的偶数行

    使用awk输出文件中的奇数行

    统计UID号小于500的用户个数

    [root@localhost ~]# awk -F ":" 'BGEIN{i=0}$3<500{i++}END{print i}' /etc/passwd

    统计UID号大于500的用户个数

    [root@localhost ~]# awk -F ":" 'BGEIN{i=0}$3>=500{i++}END{print i}' /etc/passwd

    统计有多少用户不能登录系统

    [root@localhost ~]# awk -F ":" '$7=="/sbin/nologin"{i++}END{print i}' /etc/passwd

    输出39到69之间的偶数    并统计偶数的个数

    [root@localhost ~]# seq 39 69|awk '$0%2==0{print $0;i++}END{print i}'

    输出39到69之间,是数字7倍数或是含数字7的数输出

    [root@localhost ~]# seq 39 69|awk '$0%7==0 || $0 ~ /7/{print $0}'

    Awk流程控制——选择结构    循环结构

    选择结构

    单分支

    If (条件表达式)    {动作}

    [root@localhost ~]# awk -F ":" '{ if($3<500){i++} } END{print i}' /etc/passwd

    双分支

    If (条件表达式)    {动作}    else    {动作}

    [root@localhost ~]# awk -F ":" '{ if($3<500){i++}else{j++} } END{print i,j}' /etc/passwd

    多分支

    If(条件1){指令}    else if(条件2){指令}    else if(条件3){指令}.. ..    else{指令N}

    Awk循环结构

    While(条件判断){循环体}

    Do..while循环结构    先执行循环体再判断条件

    Do{循环体}while(条件判断)

    For循环结构

    For(赋初值;条件;步长){循环体}

    Awk数组

    变量数组元素的循环结构

    For(变量名    in    数组名){循环体}

    [root@localhost shell]# awk -F ":" '{a[$1]++}END{for(i in a){print i,a[i]}}' a|sort -rk 4

  • 相关阅读:
    C#学习(二)之基础杂谈
    C#学习(一)之hello,world
    尚硅谷linux教程16-shell变量
    尚硅谷linux教程16-shell变量
    将博客搬至CSDN
    尚硅谷linux教程15 大数据 Shell编程
    linux服务器安装tomcat
    尚硅谷linux教程 javaEE定制篇 jdk安装
    尚硅谷linux教程14 yum
    尚硅谷linux教程13 RPM包管理
  • 原文地址:https://www.cnblogs.com/fina/p/5823830.html
Copyright © 2011-2022 走看看