簡體   English   中英

從匹配行打印匹配行和前一行

[英]Print Matching line and one line before from the matched line

期待在 Linux 主機上的文件中打印匹配行,並將匹配行包含在一行之前的一行。

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

[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。

可以單獨使用awk來完成:

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

這可能對你有用(GNU sed):

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

關閉隱式打印。 追加下一行。 如果附加行包含failedTimed ,則刪除換行符並打印結果。 刪除模式空間中的第一行並重復。

您能否嘗試以下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=""
  }
'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM