[英]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
我嘗試過的:
我試過使用grep
和sed
進行跟蹤,它們以某種方式起作用。
$ 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
關閉隱式打印。 追加下一行。 如果附加行包含failed
或Timed
,則刪除換行符並打印結果。 刪除模式空間中的第一行並重復。
您能否嘗試以下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.