如何用Shell脚本提取多日志文件指定块并排序输出到结果文件
用Shell脚本筛选并排序指定Unique ID的日志块
我来帮你搞定这个日志处理的需求,用Shell脚本就能轻松实现,下面是具体的方案和解释:
解决方案脚本
直接运行这个脚本就能生成符合要求的C.txt:
#!/bin/bash # 提取目标Unique ID的日志块并添加排序键 awk ' /##Start/ { block_start = $0 capture = 1 block_content = block_start "\n" next } capture { block_content = block_content $0 "\n" if (/Unique ID - ABC123/) { keep_block = 1 } if (/##End/) { if (keep_block) { # 提取起始行的时间作为排序依据,用|分隔键和内容 print substr(block_start, 1, 23) "|" block_content } capture = 0 keep_block = 0 } } ' A.txt B.txt | sort -t "|" -k1,1 | cut -d "|" -f2- > C.txt
脚本工作原理拆解
咱们一步步看这个脚本是怎么干活的:
- awk块捕获与筛选:
- 当匹配到
##Start时,开启块捕获模式,记录块的起始行,初始化块内容变量。 - 在捕获模式下,把每一行内容追加到块里;如果遇到
Unique ID - ABC123,标记这个块需要保留。 - 当匹配到
##End时,如果块被标记为保留,就把块的起始时间(前23个字符,对应日志的时间格式)作为排序键,用|和块内容拼接后输出。
- 当匹配到
- 排序处理:
- 用
sort命令以|为分隔符,按第一列的时间字符串排序(你的日志时间格式可直接按字符串排序,能保证时间顺序)。
- 用
- 生成最终文件:
- 用
cut命令去掉前面的排序键和分隔符,只保留纯净的日志块内容,输出到C.txt。
- 用
扩展说明
如果你的日志文件不止A.txt和B.txt,比如有一堆*.txt格式的日志,只需要把脚本里的A.txt B.txt换成*.txt就行,脚本会自动处理所有符合条件的文件。
内容的提问来源于stack exchange,提问作者Girish K
相关产品推荐
相关产品推荐

