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

原文地址:https://www.cnblogs.com/fina/p/5823830.html