zoukankan      html  css  js  c++  java
  • 使用awk截取某时间段的日志

    想要取出文件里面时间是9点到12点的数据,文件内容如下:

    2012-09-05 01:48:47,150 WARN  [WorkManager(3)-72] [service.PhoneRangeManager] phone range domain object not found id 1834930
    2012-09-05 02:48:47,293 WARN  [WorkManager(3)-28] [service.PhoneRangeManager] phone range domain object not found id 1834930
    2012-09-05 03:50:14,085 WARN  [WorkManager(3)-61] [service.PhoneRangeManager] phone range domain object not found id 1881137
    2012-09-05 04:50:14,223 WARN  [WorkManager(3)-67] [service.PhoneRangeManager] phone range domain object not found id 1881137
    2012-09-05 05:50:14,361 WARN  [WorkManager(3)-14] [service.PhoneRangeManager] phone range domain object not found id 1881137
    2012-09-05 06:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
    2012-09-05 07:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
    2012-09-05 08:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
    2012-09-05 10:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
    BasicAction: -3f57fefa:8d29:50463160:ddaee80 status: ActionStatus.RUNNING >, lock :com.wxxr.common.service.UserAccountLockService$Lock@10b3d72
    2012-09-05 11:52:02,732 WARN  [WorkManager(3)-46] [service.PhoneRangeManager] phone range domain object not found id 1881137
    2012-09-05 12:52:02,873 WARN  [WorkManager(3)-19] [service.PhoneRangeManager] phone range domain object not found id 1881137
    2012-09-05 09:52:03,010 WARN  [WorkManager(3)-95] [service.PhoneRangeManager] phone range domain object not found id 1881137

    需要注意的是一条日志可能占两行。
    执行代码如下:
    awk -F'[ -:]' '$4 >= 9 && $4 <= 12{print;nextline=NR+1}$1$2$3 !~ /d+/ && NR == nextline' data
     
    讲解:

    awk内置变量

    awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

    ARGC 命令行参数个数
    ARGV 命令行参数排列
    ENVIRON 支持队列中系统环境变量的使用
    FILENAME awk浏览的文件名
    FNR 浏览文件的记录数
    FS 设置输入域分隔符,等价于命令行 -F选项
    NF 浏览记录的域的个数
    NR 已读的记录数
    OFS 输出域分隔符
    ORS 输出记录分隔符
    RS 控制记录分隔符

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
    awk处理过程: 依次对每一行进行处理,然后输出
    awk命令形式:
    awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
     [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
    '  '          引用代码块
    BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
    //           匹配代码块,可以是字符串或正则表达式
    {}           命令代码块,包含一条或多条命令
    ;          多条命令使用分号分隔
    END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
     
    特殊要点:
    $0           表示整个当前行
    $1           每行第一个字段
    NF          字段数量变量
    NR          每行的记录号,多文件记录递增
    FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
               制表符
              换行符
    FS          BEGIN时定义分隔符
    RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
    ~            匹配,与==相比不是精确比较
    !~           不匹配,不精确比较
    ==         等于,必须全部相等,精确比较
    !=           不等于,精确比较
    &&      逻辑与
    ||             逻辑或
    +            匹配时表示1个或1个以上
    /[0-9][0-9]+/   两个或两个以上数字
    /[0-9][0-9]*/    一个或一个以上数字
    FILENAME 文件名
    OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
    ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
    -F'[:#/]'   定义三个分隔符
  • 相关阅读:
    软件工程课件
    团队博客作业Week1
    IntelliJ IDEA下Git的配置与使用(命令行下)
    Java语言程序设计课程学期总结
    JDBC访问数据库的一些小技巧
    Conference-Web Search and Data Mining
    线程停止与volatile
    班会-2016-2017第2学期
    Java第11次实验(JDBC数据库编程)
    Python-Jupyter Notebook使用技巧
  • 原文地址:https://www.cnblogs.com/nzg-noway/p/6526540.html
Copyright © 2011-2022 走看看