我有一个难以阅读的日志文件,因为长十六进制字符串(哈希,签名),我正在寻找一种用缩短版本替换这些字符串的方法。
示例:
$ cat 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(c70cd816cd441fda978f6302739892c0877349901c71f1bc9e637159b47989a7), signature: dfc14c535a9cddd861d640310a9d94252aa7d67c330a218312705d26c0d8b8d1670976566754033798d08b6c484470af18e985420f9048c782cd61ea212d416500 }
我尝试使用sed
并设法缩短签名:
$ cat sample_line | sed 's/signature: \(.\{6\}\)\w* \(.*\)/signature: \1…\2/'
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(c70cd816cd441fda978f6302739892c0877349901c71f1bc9e637159b47989a7), signature: dfc14c…}
然而,这不是一个非常令人满意的解决方案,因为它不是非常通用。
我想要的是什么:
用min替换任何十六进制字符串的命令。比如32个字符的长度,其中前6个字符加上省略号。对于给定的示例:
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(c70cd8…), signature: dfc14c… }
用min来缩短任何字符串就足够了。长度(因为那个日志中没有其他长字符串)。
我怀疑其他工具(awk)更适合这项任务。
答案 0 :(得分:0)
您可以使用sed
。只需将第一个初始的6个十六进制字符放入捕获组,然后忽略其余的十六进制字符。
$ cat 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(c70cd816cd441fda978f6302739892c0877349901c71f1bc9e637159b47989a7), signature: dfc14c535a9cddd861d640310a9d94252aa7d67c330a218312705d26c0d8b8d1670976566754033798d08b6c484470af18e985420f9048c782cd61ea212d416500 }
$ sed -r 's/([a-f0-9]{6})[a-f0-9]+/\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(c70cd8...), signature: dfc14c... }