【问题标题】:Print Matching line and one line before from the matched line打印匹配行和匹配行之前的一行
【发布时间】:2020-02-20 12:26:11
【问题描述】:

期待在Linux主机上的一个文件中打印Matching line,并将匹配行之前的一行打印到一行中。

以下只是日志文件中的内容:

[2020/02/18 08:25:21.229198,  1] ../source3/lib/smbldap.c:1206(get_cached_ldap_connect)
  Connection to LDAP server failed for the 1 try!
[2020/02/18 08:25:21.229221,  2] ../source3/passdb/pdb_ldap_util.c:287(smbldap_search_domain_info)
  smbldap_search_domain_info: Problem during LDAPsearch: Timed out

我尝试过的:

我已尝试使用 grepsed 进行跟踪,这在某种程度上可行..

$ egrep -B 1 "failed|Timed" /var/log/samba/smbd.log.old |tr -d "\n" | sed "s/--/\n/g"


[2020/02/18 08:25:21.229198,  1] ../source3/lib/smbldap.c:1206(get_cached_ldap_connect)  Connection to LDAP server failed for the 1 try!
[2020/02/18 08:25:21.229221,  2] ../source3/passdb/pdb_ldap_util.c:287(smbldap_search_domain_info) smbldap_search_domain_info: Problem during LDAPsearch: Timed out

这看起来不是一个更清洁的解决方案,我期待一些专家的单行,awk、sed、grep 甚至 python 都可以接受一个行。

【问题讨论】:

    标签: python linux awk sed grep


    【解决方案1】:

    可以单独使用awk

    awk ' /Timed|failed/ { print previous, $0; }; {previous = $0;}' /var/log/samba/smbd.log.old
    

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed -n 'N;/\n.*\(failed\|Timed\)/s/\n//p;D' file
      

      关闭隐式打印。追加下一行。如果附加行包含failedTimed,则删除换行符并打印结果。删除模式空间中的第一行并重复。

      【讨论】:

        【解决方案3】:

        您能否尝试关注tac + awk 解决方案:

        tac Input_file | awk '/failed/{found=1;val=$0;next} found && NF{print $0,val;val=found=""}'
        

        或添加非单线形式的解决方案:

        tac Input_file | 
        awk '
          /failed/{
            found=1
            val=$0
            next
          }
          found && NF{
            print $0,val
            val=found=""
          }
        '
        

        【讨论】:

          猜你喜欢
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 2021-06-16
          • 1970-01-01
          • 2011-05-01
          相关资源
          最近更新 更多