日志文件处理:缩短长十六进制字符串(哈希、签名)
我来分享几个简单高效的办法,帮你把日志里那些冗长的哈希、签名这类十六进制字符串缩短,让日志可读性大大提升:
方法1:用sed快速批量替换
sed是处理文本替换的利器,适合快速批量处理日志文件。我们可以用正则匹配长十六进制字符串,把它们替换成「前8位+...」的形式(长度可以按需调整)。
比如针对你的示例日志行,执行以下命令:
sed -E 's/([a-fA-F0-9]{8})[a-fA-F0-9]{24,}/\1.../g' sample_line
处理后的效果:
2018-04-17 13:08:03 IO Worker #2 TRACE engine Handling a valid ConsensusMessage { vote_step: VoteStep { height: 1, view: 1, step: Precommit }, block_hash: Some(c70cd816...), signature: dfc14c53... }
说明:
-E启用扩展正则表达式,让写法更简洁([a-fA-F0-9]{8})捕获前8位十六进制字符,作为替换后的前缀[a-fA-F0-9]{24,}匹配后续至少24位的十六进制内容(确保只替换长字符串,避免误改短代码)/g表示全局替换,一行里所有符合条件的字符串都会被处理
如果要直接修改原日志文件(记得先备份!),可以加-i参数:
sed -i.bak -E 's/([a-fA-F0-9]{8})[a-fA-F0-9]{24,}/\1.../g' your_log_file.log
-i.bak会先创建原文件的备份,避免误操作丢失数据。
方法2:用awk精准定位字段替换
如果你的日志格式比较固定,比如哈希和签名总是出现在特定的键后面(比如block_hash: Some(、signature:),用awk可以更精准地处理,避免误替换其他无关的十六进制内容。
示例脚本:
awk '{ # 处理block_hash里的哈希 sub(/block_hash: Some\(([a-fA-F0-9]{8})[a-fA-F0-9]+\)/, "block_hash: Some(\\1...)", $0) # 处理signature后的签名 sub(/signature: ([a-fA-F0-9]{8})[a-fA-F0-9]+/, "signature: \\1...", $0) print $0 }' sample_line
这个方法会只针对block_hash: Some(...)和signature:后面的长十六进制字符串进行缩短,更安全,不会影响日志里其他可能存在的短十六进制内容。
方法3:用Python脚本处理复杂场景
如果日志格式多变,或者需要更灵活的逻辑(比如根据哈希长度动态调整缩短后的长度),可以写个简单的Python脚本:
import re def shorten_hex_strings(line): # 匹配长十六进制字符串(长度≥32位,对应常见的SHA-256哈希) pattern = re.compile(r'([a-fA-F0-9]{8})([a-fA-F0-9]{24,})') return pattern.sub(r'\1...', line) # 处理单条示例 with open('sample_line', 'r') as f: for line in f: print(shorten_hex_strings(line.strip())) # 如果要处理整个日志文件 # with open('your_log.log', 'r') as infile, open('shortened_log.log', 'w') as outfile: # for line in infile: # outfile.write(shorten_hex_strings(line))
这个脚本可以轻松扩展,比如你想把缩短后的长度改成前10位,只需要把正则里的{8}改成{10}就行。
内容的提问来源于stack exchange,提问作者didi_X8

