zoukankan      html  css  js  c++  java
  • (4)三剑客之awk

    (1)awk工作原理
    #awk -F: '{print $1,$3}' /etc/passwd
    1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,已换行符结束
    2)然后行被:分割成字段,每个字段存储在已编号的变量中,从$1开始,最多达100个字段
    3)awk如何知道用空格来分隔字段的呢,因为有一个内部变量FS来确定字段分割符。初始时FS被赋予空格
    4)awk打印字段时,将以设置的方法使用print函数打印,awk在打印字段间加上空格,因为$1,$3之间有个逗号,逗号比较特殊,它映射为另一个内部变量,称为输出字段分割符OFS,OFS默认为空格
    5)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分割成字段并进行处理,该过程将持续到所有行处理完毕
    (2)awk语法格式
    1)语法格式:awk [options] 'command' filename
    2)options
    -F :定义输入字段分割符,默认的分隔符是空格或制表符(tab键)
    3)command
    BEGIN{}通常用于定义一些变量,例如BEGIN{FS=":";OFS="----"}
    BEGIN{} {} END{}
    行处理前 行处理 行处理后
    # awk 'BEGIN{print 1/2}{print "ok"}END{print "-------"}' /etc/hosts
    0.5
    ok
    ok
    -------

    4)命令格式:
    awk 'pattern' filename 示例: awk -F:'/root/' /etc/passwd
    awk '{action}' filename 示例:awk -F: '/root/{$1,$3}' /etc/passwd
    awk 'pattern {action}' 示例:awk -F: '/root/{print $1,$3}' /etc/passwd
    awk 'BEGIN{FS=":"}/root/{print $1,$3}' /etc/passwd
    command | awk 'pattern{action}' 示例:df -P | grep "/" | awk '$4 > 25000 {print $0}'

    (3)内部变量
    $0:整行记录 示例:awk -F: '{print $0}' passwd
    NR:行尾加个序号 示例:awk -F: '{print $0,NR}' passwd
    FNR:行首加个序号 示例:awk -F: '{print FNR,$0}' passwd
    NF:统计每行的字段数量 示例:awk -F: '{print $0,NF}' passwd
    $NF:行最后一个字段 示例:awk -F: '{print $NF }' passwd awk -F: '{print $(NF-1)}' passwd
    FS:输入字段分割符 示例:awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd
      awk -F'[ : ]' '/root/{print $1,$3}' /etc/passwd
      awk -F: '/root/{print $1,$3}' /etc/passwd
    OFS:输出字段分隔符 示例:awk -F: '{print $1,$2,$3,$4}' /etc/passwd \默认逗号就是空格
      awk 'BEGIN{FS=":";OFS="+++"}{print $1,$2,$3,$4}' /etc/passwd
    ORS :输出行分隔符 示例:awk 'BEGIN{ORS=" "}{print $0}' passwd \将文件合并成一行,ORS默认输出一条记录应该是回车,这里改成输出一条使用空格而不是换行符
    RS:输入行分隔符 示例: # cat /etc/passwd | head -1 >passwd1
      awk 'BEGIN{RS=":"}{print $0}' passwd1 \把一行内容根据分隔符输出成多行

    总结:
    字段分割符:FS OFS 默认空格或tab
    行分隔符:RS ORS 默认换行符

    (4)格式化输出
    1)print函数
    date | awk '{print "Mount:"$2 " Year:" $NF}'
    awk -F: '{print "Username:" $1 " Uid:" $3}' /etc/passwd
    awk -F: '{print "Username,Uid:" $1,$3"!"}' /etc/passwd

    2)printf函数
    awk -F: '{printf "%-15s %-10s %-14s ",$1,$2,$3}' /etc/passwd
    %s:字符类型
    %d:数值类型
    %f:浮点类型
    15:表示占用15个字符
    - :表示左对齐,默认为右对齐
    printf默认不会再行尾自动换行,加

    (5)awk模式和动作
    任何awk语句都由模式和动作组成,模式部分决定动作语句何时触发,模式可以是正则表达式,条件语句,复合语句
    1)正则表达式
    匹配整行:
    #awk '/^root/' /etc/passwd
    # awk '!/^root/' /etc/passwd
    匹配字段:操作符(~ 或 ~!)
    # awk -F: '$NF !~ /^bash/' /etc/passwd
    # awk -F: '$1 ~ /^root/' /etc/passwd

    2)关系运算符:< <= == != >= > 字符串比较需要双引号
    awk -F: '$3 == 0' /etc/passwd
    awk -F: '$3 < 10' /etc/passwd
    awk -F: '$7 == "/bin/bash"' /etc/passwd
    awk -F: '$1 ~ /root/' /etc/passwd
    awk -F: '$1 !~ /root/' /etc/passwd
    df -P | awk '$4 > 25000'
    3)条件表达式
    awk -F: '$3>300{print $0}' /etc/passwd
    awk -F: '{if($3>300)print $0}' /etc/passwd
    awk -F: '{if ($3>300){print $0}}' /etc/passwd
    awk -F: '{if($3>300){print $3}else{print$1}}' /etc/passwd
    4)算术运算:+ - * / % ^
    awk -F: '{if($3*10 > 140 ){print $0}}' /etc/passwd
    5)逻辑运算符:&&与 ||或 !
    awk '$1~/root/ && $3<15' /etc/passwd
    awk '!($1~/root/ && $3<15)' /etc/passwd
    (6)awk脚本编程之条件判断
    1)if语句 语法格式:{if(表达式){语句;语句;...}}
    awk -F":" '{if($3 == 0){print $1,"is administrator!"}}' /etc/passwd
    awk -F":" '{if($3>0 && $3<1000){count++;}} END{print count}' /etc/passwd \统计系统用户数
    2)if..else语句
    语法格式:{if(表达式){语句;} else{语句;}}
    awk -F":" '{if($3 == 0){count++;}else{i++;}} END{print "管理员个数:"count;print "系统用户数:"i}' /etc/passwd
    3)if..else if..else语句 {if(表达式){语句} else if(表达式){语句} else{语句}}
    awk -F":" '{if($3 == 0){count++;} else if($3>0 && $3<1000){i++;} else{j++}} END{print "管理员个数:"count;print "系统用户数:"i;print "普通用户数:"j}' /etc/passwd
    (7)awk脚本编程之while循环
    1)语法:{初始值;while(条件){语句;语句}}
    awk 'BEGIN{i=1;while(i<=10){print i;i++}}' \打印1到10
    awk -F":" '{i=1;while(i<=7){print $i;i++}}' /etc/passwd
    awk '{i=1;while(i<=NF){print $i;i++}}' /etc/hosts \打印每行的字段

    (8)awk脚本编程之for循环
    1)语法:{for(条件){语句}}
    awk 'BEGIN{for(i=1;i<=10;i++){print i}}'
    awk '{for(i=1;i<=NF;i++){print $i}}' /etc/hosts 等同于awk '{i=1;while(i<=NF){print $i;i++}}' /etc/hosts

    (9)awk脚本编程之数组:把需要遍历的对象作为数组的索引
    awk '{数组名[遍历对象]++} END{for(i in 数组名){print i,数组名[i]}}'

    统计shell种类: awk -F":" '{shells[$NF]++} END{for(i in shells){print i,shells[i]}}' /etc/passwd
    统计网站状态:netstat -ant | grep '192.168.1.253:80' | awk '{status[$NF]++} END{for(i in status){print i,status[i]}}'
    ss -an | grep "192.168.1.2:80" | awk '{status[$1]++} END{for(i in status){print i,status[i]}}'
    统计当前访问的每个ip数量:
    netstat -ant| grep "192.168.1.2:80" | awk -F '[ :]+' '{ip_count[$6]++} END{for(i in ip_count){print i,ip_count[i]}}'| sort -k2 -rn

    (10)awk函数:
    统计用户名是4个字符
    #awk -F: '$1 ~ /^....$/{count++;print $1} END{print "count is:"count}' /etc/passwd
    #awk -F: 'length($1)==4{count++;print $1} END{print "count is:"count}' /etc/passwd
    (11)awk引用外部变量
    打印挂载分区使用容量超过10%的分区 ,这里int($5)取整数
    df -h | awk -v i=10 '{if(int($5) > i){print $6":"$5}}'

  • 相关阅读:
    发送邮件
    C#操作Excel总结
    注意!监控MySQL服务是否正常,懂这4种方法就可以了
    Linux磁盘空间爆满怎么办?定时文件清理脚本配置实现
    Linux 服务器必备的安全设置,建议收藏!
    MySQL入门到精通:MySQL 选择数据库
    TIOBE3月榜单公布!C 语言稳居第一,将新增功能,消除差异
    C++如何读取带空格字符串?这5种方法教会你
    C语言丨二分查找算法详解(含示例代码)
    线上故障了!居然是因为Linux磁盘缓存机制导致的
  • 原文地址:https://www.cnblogs.com/lovelinux199075/p/8964700.html
Copyright © 2011-2022 走看看