• awk使用


    awk处理方式:

         awk一次处理一行内容
         awk对每行可以切片处理
         awk '{print $1}'   //输出首个单词
    

    awk-格式

        命令行格式
         awk [options] 'command' file(s)
         脚本格式
         awk -f awk-script-file file(s)
    

    awk内置参数应用

         awk内置变量1
         $0: 表示整个当前行
         $1: 表示第一个字段
         $2: 表示第一个字段
         awk内置参数:分隔符
         options: -F field-separator (默认空格)
          awk -F ':' '{print $1}'
          awk -F ':' '{print "User:"$1"  uid:"$3}' passwd
         awk 内置变量2
            NR:每行的记录号
            NF:字段数量变量
            FILENAME:正在处理的文件名称
    
    [root@186 tmp]#  awk -F ':' '{print NR,NF}' passwd
    1 7(7个字段)
    2 7
    3 7
    [root@186 tmp]# awk -F ':' '{print FILENAME}' passwd
    passwd (文件名称)
    passwd
    

    案例一:显示passwd每行的行号,每行的列数,对应的用户名(print,printf)

    [root@186 tmp]# awk -F ':' '{print "Line: "NR,"Col: "NF,"username: "$1}' passwd
    Line: 1 Col: 7 username: root
    Line: 2 Col: 7 username: bin
    Line: 3 Col: 7 username: daemon
    [root@186 tmp]# awk -F ':' '{printf("Line:%s Col:%s username:%s
    ",NF,NR,$1)}' passwd
    Line:7 Col:1 username:root
    Line:7 Col:2 username:bin
    Line:7 Col:3 username:daemon
    

    案例二:显示passwd中的用户id大于100的行号和用户名(if..else...)

    [root@186 tmp]# awk -F ':' '{if ($3>100) print "Line: "NR,"username: "$1}' passwd
    Line: 14 username: systemd-network
    Line: 16 username: polkitd
    Line: 19 username: cs
    Line: 20 username: user
    

    案例三:在服务log日志中找出error的错误日期

    [root@186 tmp]# awk '/Error/{print $1,$2,$3}' messages 
    Apr 7 10:02:30
    Apr 7 10:02:30
    Apr 7 10:02:30
    

    awk--逻辑判断式
    command:pattern {awk 操作命令}
    pattern:正则表达式;逻辑判断式
    ,! : 匹配正则表达式
    ==,!=,<,>: 判断逻辑表达式
    例子:

    #查询第一列以m开头的名称
    [root@186 tmp]# awk -F ':' '$1~/^m.*/{print $1}' passwd
    mail
    #取反
    [root@186 tmp]# awk -F ':' '$1!~/^m.*/{print $1}' passwd
    root
    bin
    daemon
    #大于100的uid
    [root@186 tmp]# awk -F ':' '$3>100{print $1,$3}' passwd
    systemd-network 192
    polkitd 999
    cs 1000
    user 1001
    

    awk-扩展格式
    command2扩展:
    BEGIN{PRINT "sart"} pattern{command}END{print "end"}
    awk逐行读取并处理,循环的。
    BEGIN是在读取之前,END是在读取之后,所以他们都没参加循环
    例子:
    制表显示passwd每行的行号,每行的列数,对应行的用户名。

    [root@186 tmp]# awk -F ':' 'BEGIN{print "Line Col name"}{print NR,NF,$1}END{print "----"FILENAME"--"}' passwd
    Line Col name  #BEGIN输出内容
    1 7 root
    2 7 bin
    20 7 user
    ----passwd--   #END输出内容
    

    统计当前文件夹下的文件/文件夹占用的大小
    思路:循环前设置初始值,循环相加5列,最后输出结果

    [root@186 tmp]# ll
    total 200
    -rw-------. 1 root root 198047 Apr  8 22:24 messages
    -rw-r--r--. 1 root root    872 Apr  8 22:01 passwd
    [root@186 tmp]# ls -l|awk 'BEGIN{size=0}{size+=$5}END{print "size is : "size/1024"k"}'
    size is : 194.257k
    

    统计passwd的总用户数
    $1!~/^$/ 判断该行不为空行

    [root@186 tmp]# awk 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' passwd 
    20
    

    统计显示uid大于100的用户名

    [root@186 tmp]# awk -F ':' 'BEGIN{count=0}{if ($3 > 100) name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i]}' passwd 
    0 systemd-network
    1 polkitd
    2 cs
    3 user
    

    统计netstat -anp状态下为LISTEN和CONNECTED的连接数

    [root@186 tmp]# netstat -anp|awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum)print i,sum[i]}'
    LISTEN 2
    CONNECTED 50
    

    awk和sed比较
    两者都是对文本进行处理
    awk侧重于复杂逻辑处理
    sed侧重于正则处理

    做一个决定,并不难,难的是付诸行动,并且坚持到底。
  • 相关阅读:
    002-pythn基础-循环、编码
    001-python3 初识
    confluence6.x安装
    python+ffmpeg切割视频
    Elasticsearch6.x和Kibana6.x的安装
    django基础
    CDH的完全离线安装(ubuntu16)
    python之旅十【第十篇】paramiko模块
    解决 MariaDB无密码就可以登录的问题
    切割日志(mysql,nginx,php tomcat)使用logrotate
  • 原文地址:https://www.cnblogs.com/wukc/p/14633522.html
Copyright © 2020-2023  润新知