如何提取日志中session="asd1"对应的请求响应完整多行日志
提取指定session关联完整日志的操作方法
你的日志是典型的多行块结构:每条完整的Request/Response日志都以行首带[的时间戳行作为起始,到对应的XML闭合标签</Request>/</Response>结束,单行关键词匹配只能抓到带session字段的行,必须先按块边界拆分再做筛选,以下是几种可直接用的方案:
方案1:awk命令处理(最通用,适合大日志文件)
逻辑是逐行读取时缓存当前正在读取的日志块,遇到下一个块的起始时间戳、或者读到文件末尾时,判断当前缓存的块是否包含目标session="asd1",符合就输出完整块。
直接在命令行执行:
awk ' /^\[/ { if (block ~ /session="asd1"/) print block block = $0 "\n" next } { block = block $0 "\n" } END { if (block ~ /session="asd1"/) print block } ' 你的日志文件路径
执行后输出的结果就是目标session对应的两段完整日志:
[24/11/11 09:49:57:538 EST] DEBUG <?xml version="1.1" encoding="UTF-8" ?> <Request session="asd1" id=23243> <type>Balance</type> </Request> [24/11/11 17:49:57:538 EST] DEBUG <?xml version="1.1" encoding="UTF-8" ?> <Response session="asd1" id=545645> <type>Withdrawal</type> <code>0000</code> </Response>
如果需要提取其他session的日志,直接把命令里的session="asd1"替换成目标字符串即可。
方案2:grep上下文匹配(仅适合日志块行数固定的场景)
你提供的样例里每条日志固定为5行,带session字段的行是块内的第3行,此时可以用grep的前后文参数抓固定行数的内容:
grep -B 2 -A 2 'session="asd1"' 你的日志文件路径
参数说明:
-B 2:输出匹配行的前2行-A 2:输出匹配行的后2行
注意:如果后续日志块行数变化(比如Response带更多返回字段),这个方法会出现抓不全、多抓相邻日志的问题,优先用awk方案。
方案3:vim/less浏览时手动提取块
如果是直接在编辑器里查看日志:
- 打开日志后先搜索到目标行:按
/输入session="asd1"回车定位 - 因为每个块以行首
[为分隔,按V进入行选中模式,再输入ap选中当前段落(块),即可复制完整的日志内容。
内容的提问来源于stack exchange,提问作者Stalkeo
相关产品推荐
相关产品推荐

