美文网首页Linux.命令LinuxLinux学习与应用技巧
awk基本用法 、 awk应用案例 、 综合脚本

awk基本用法 、 awk应用案例 、 综合脚本

作者: 秋天丢了李姑娘 | 来源:发表于2021-06-09 21:47 被阅读0次

    链接

    一,sed其他指令:

    a行下追加 i行上添加 c 替换整行

    sed 'a 666' user    //所有行的下面追加666
    sed '1a 666' user   //第1行的下面追加666
    sed '/^bin/a 666' user   //在以bin开头的行的下面追加666
    sed 'i 666' user  //所有行的上面添加666
    sed '5i 666' user   //第5行的上面添加666
    sed '$i 666' user  //最后1行的上面添加666
    sed 'c 666' user   //所有行都替换成666
    sed '1c 666' user  //替换第1行为666
    

    二,awk

    可以实现精确搜索
    awk使用方式
    1,前置指令 | awk 选项 条件 指令
    2,awk 选项 条件 指令 被处理文档
    选项 -F 定义分隔符
    指令 print 输出
    内置变量 $1第1列 $2第2列 $3第3列 ......$0所有列 NR行号 NF列号

    awk '{print}' user     //输出所有行
    awk '/root/{print}' user    //输出包含root的行
    awk '/root|bin/{print}' user   //输入包含root或bin的行
    
    awk '{print $1}'  user   //输出所有行的第1列
    awk '/root/{print $1}' user     //找包含root的行,显示第1列
    awk '/^bin/{print $3}' user   //找以bin开头的行,显示第3列
    awk '/^bin/{print $3,$1}' user     //找以bin开头的行,显示第3列,第1列
    awk '/^bin/{print $3,$1,$0}' user  //找以bin开头的行,显示第3列,第1列,所有列
    awk '/^bin/{print NR}' user    //找以bin开头的行,显示该行的行号
    awk '/^bin/{print NR,$0}' user   //找以bin开头的行,显示该行的行号,所有列
    awk '{print NF}'   user   //输出所有行的列号(每行有几列)
    
    awk -F: '{print $1}' user   //文档中如果没有空格,可以用F修改分隔符
    awk -F: '{print $1,$6}' user    //使用冒号作为列的分隔符,显示第1、6列
    awk -F: '{print $1" 的家目录是 "$6}' user    //还可以输出常量,加双引号即可
    awk -F: '{print $1" 的解释器是 "$7}' user
    

    收集根分区剩余容量

    df -h | awk  '/\/$/{print  $4}'    //使用df  -h 作为前置指令交给awk处理找到以/结尾的行,并输出第4列
    df -h | awk  '/\/$/{print  "根分区剩余容量是"$4}'
    

    收集网卡流量信息

    ifconfig eth0 | awk  '/RX p/{print  "服务器eth0网卡的接收数据量是"$5"字节"}'
    ifconfig eth0 | awk  '/TX p/{print  "服务器eth0网卡的发送数据量是"$5"字节"}'
    

    三,awk中的条件

    1,使用正则 ~包含 !~不包含

    awk -F: '$5~/bin/{print}' user   //找第5列包含bin的行
    awk -F: '$5!~/bin/{print}' user  //找第5列不包含bin的行
    

    2,使用数字或者字符串

    == != >= > <= <

    awk -F: 'NR==1{print}' user   //找第1行
    awk -F: 'NR<=3{print}' user    //找1~3行
    awk -F: '$7=="bash"' user  //找第7列等于bash的行
    awk -F: '$7!="bash"' user   //找第7列不等于bash的行
    

    3,逻辑组合 && 并且 || 或者

    awk -F: '$7~/bash/&&NR<=3{print}' user  //找第7列包含bash并且行号是1~3的
    awk -F: '$7~/bash/||NR<=3{print}' user  //找第7列包含bash或者行号是1~3的
    

    4,运算
    + - * / %
    +

    awk -F: '$3%2==0' /etc/passwd    //输出id号是偶数的用户
    

    四,awk处理时机,可以执行额外任务

    BEGIN{ } 执行1次,读取文档之前执行
    逐行任务 执行n次,读取文档时执行
    END{ } 执行1次,读取文档之后执行

    awk BEGIN{ }{ }END{ } //基本格式


    awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6 }END{print "总计"NR"行"}' user    //按下图输出信息,其中\t可以实现tab键效果,有一定的对齐功能
    -
    

    使用awk统计网站访问量
    开启httpd服务,80端口或者82端口都可以
    使用curl 192.168.4.7:82 或127.0.0.1:82 或 其他主机 多访问几次网站
    测试时可以关闭防火墙和selinux

    systemctl stop firewalld
    setenforce  0
    awk  '{print $1}'  /var/log/httpd/access_log
    

    五,awk数组加for循环实现高级搜索

    数组 相当于可以存储多个值的特殊变量
    数组名称[下标]=下标对应的值

    a[1]=10
    a[2]=20
    awk 'BEGIN{a[1]=10;a[2]=20;print a[2],a[1]}'    //使用awk测试数组,首先创建数组a,下标1对应值是10,下标2对应值是20,然后输出下标是2与下标是1的值
    awk 'BEGIN{a["aa"]="abc";a["xx"]="xyz";print a["xx"],a["aa"]}'   //数组的下标与值都可以不是数字
    

    数组用来收集信息
    for循环可以循环输出数组的下标

    awk 'BEGIN{a[1]=10;a[2]=20;for(i in a){print a[i]}}'   //首先创建数组,定义了几个下标与对应的值,然后利用for循环,可以循环显示数组a的下标,下标都存在变量i中,最后喊出,数组中有几个下标,就会喊出几个结果
    
    abc    a[abc]++     a[abc]=1
    xyz    a[xyz]++     a[xyz]=1
    abc    a[abc]++     a[abc]=2
    opq    a[opq]++     a[opq]=1
    xyz    a[xyz]++     a[xyz]=2
    abc    a[abc]++     a[abc]=3
    
    awk '{a[$1]++}END{for(i in a){print a[i],i}}' abc.txt   //使用逐行任务与数组收集文档abc.txt中的信息,然后在END任务中使用for循环显示所有数组a的值与下标
    
    awk '{a[$1]++}END{for(i in a){print i,a[i]}}'  /var/log/httpd/access_log  //将上述的abc.txt文件替换成网站的日志,就可以最终用来查看日志得到可以得到哪个ip来访以及来访的次数
    
    awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log |sort -nr -k 2
    //使用sort命令增加排序功能,-n是以数字形式排序,-r是降序, -k是指定为
    
    #第几列排序
    
    awk '/Failed password for root/{a[$11]++}END{for(i in a){print i,a[i]}}' /var/log/secure
    //使用awk数组+for循环收集安全日志中关于登录root账号密码错误的ip记录
    

    编写脚本,可以收集系统信息

    #!/bin/bash
    while :
    do
    clear      //可以实现清屏效果
    awk 'END{print "用户总数是"NR"个"}' /etc/passwd
    uptime | awk '{print "cpu的15分钟平均负载是"$NF}'
    free -h | awk '/^Mem/{print "内存剩余空间是"$4}'
    echo 当前登陆服务器用户数量是$(who | wc -l)个
    echo 当前进程数量是$(ps aux | wc -l)个
    echo 服务器安装软件包总数是$(rpm -qa | wc -l)个
    sleep 3     
    done
    

    相关文章

      网友评论

        本文标题:awk基本用法 、 awk应用案例 、 综合脚本

        本文链接:https://www.haomeiwen.com/subject/yaryeltx.html