【问题标题】:shell script to parse log file用于解析日志文件的 shell 脚本
【发布时间】:2011-04-27 20:14:31
【问题描述】:

我得到了一个日志文件(见下文),我需要使用 bash 脚本将其转换为这种格式:

标题 pdfspool 日期 rip 日期 bmpspool 日期 CLAB 日期 Sometitle12 10/09/23 00:56:40 10/9/23 0:56:46 10/9/23 0:56:50 10/9/23 1:01:13

日志文件

!!开始 来源 aserver:pdf_spool:the, Job 844b015e0043469e, Inst 844b015e0043469e 标题 Sometitle12.pdf 收到行动开始,确定日期 10/09/23 00:56:40 对于管理员 (8) 数据类型 = PDF (17) 源 = srv01:aserver:file_input:0 !!结尾 !!开始 源服务器:rip:rip1,作业 844b015e0043469e,Inst 844b015e004346a0 标题 Sometitle12.pdf 青色 1 行动开始传输,确定日期 10/09/23 00:56:46 对于管理员 (8) 数据类型 = 位图 (1) 目的地 = srv01:bserver:bmp_spool:the (4) 父级 = 844b015e0043469e/844b015e0043469e !!结尾 !!开始 源 bserver:bmp_spool:the, Job 844b015e0043469e, Inst 844b015e004346a0 标题 Sometitle12.pdf 青色 1 行动开始收到,好的 日期 10/09/23 00:56:50 对于管理员 (8) 数据类型 = 位图 (17) 来源 = srv01:aserver:rip:rip1 !!结尾 !!开始 源 bserver:bmp_spool:the, Job 844b015e0043469e, Inst 844b015e004346a0 标题 Sometitle12.pdf 青色 1 Action Atomic 接受,OK 日期 10/09/23 01:01:13 对于管理员 (8) 数据类型 = 位图 (2) 来源队列 = ^03Newspaper ltd(MP)^Date - 24MP^Site - N^ (5) 请求者 = clab (15) 审批状态=等待审批 从等待更改为由 clab 批准。 !!结尾

欢迎提出想法。

谢谢!

【问题讨论】:

    标签: bash shell sed awk grep


    【解决方案1】:
    awk 'BEGIN{}
    /Action Started Received/ && !c{ pdfspooldate=$(NF-1)$NF ;c++}
    /Action Started Received/ && c{ bmppooldate=$(NF-1)$NF ;c=0}
    /Action Started Transmit/{ ripdate=$(NF-1)$NF }
    /title/ { title=$2}
    /Action Atomic Accepted/{ clabdate=$(NF-1)$NF }
    END{ print title,pdfspooldate,ripdate,clabdate }' file
    

    【讨论】:

    • 谢谢!它工作得很好,除了你跳过了与 pdfspooldate 具有相同模式的 bmpspool 日期。如何区分它们?
    • 我现在如何解析包含多个日志的文件?顺便说一句,我在柜台中使用了 $c=2 并且它起作用了。
    【解决方案2】:

    使用 awk。写一个状态机。当你看到/^!!Begin$/ 时切换状态,记录你的数据,然后转储你的输出,当你看到/^!!End$/ 时切换回来。

    【讨论】:

      【解决方案3】:

      如果你使用 Perl/Python/Ruby,你应该可以在一行中使用正则表达式匹配(匹配部分)。使用多行模式,. 将匹配换行符。我认为 awk 或 sed 应该能够以同样的方式使用正则表达式:

      例如,在 Ruby 中:

      s = <<TEXT
      !!Begin
      Something haha
      Title Good Bad Ugly
      Date 1/1/2008
      !!End
      !!Begin
      Other info
      Title Iron Man
      Date 2/2/2010
      TEXT
      
      result = s.scan(/^!!Begin.*?^Title\s+([^\n]*).*?^Date\s+([^\n]*)/m)
      
      p result
      
      result.each do |arr|
        puts arr.join(' ')
      end
      

      输出:

      $ ruby try.rb 
      [["Good Bad Ugly", "1/1/2008"], ["Iron Man", "2/2/2010"]]
      Good Bad Ugly 1/1/2008
      Iron Man 2/2/2010
      

      【讨论】:

      • 如何读取文本文件并将其传递给此处的“s”变量? get_file_as_text 不起作用
      【解决方案4】:

      我会将 Perl 与 $/ = "!!End" 一起使用,然后解析每个段落。

      【讨论】:

        猜你喜欢
        • 2014-12-22
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多