我有一个看起来像这样的文件:
.
.
.
15 02 2013 12:05:07 [DBG] vspd[3327]: VSP 0: RX 452B30303032340D
15 02 2013 12:05:07 [DBG] vspd[3327]: VSP 0: WX 452B30303032340D
串口通信的Sniffer日志。
如何自动将十六进制字符代码转换为字符串?
我尝试使用这样的东西:
cat vspd.log | awk -F'(RX|WX)[[:space:]]*' '{print $2}' | awk 'BEGIN { FS = "" }{for (i = 1; i < NF; i = i + 1) a=$i$i+1;printf "%s", a; print}' | xxd -r
但它只取得了非常局部的成功,我认为我用管子搞砸了。
问题是如何转换
tail -f file.log | awk -F'(RX|WX)[[:space:]]*' '{print $2}'
变成可读的东西?
答案 0 :(得分:1)
使用GNU awk,您可以使用strtonum()
转换十六进制数,例如:
function hex2str(n) {
s = ""
for(i=1; i<=length(n)-2; i+=2)
s = s sprintf("%c", strtonum("0x" substr(n, i, 2)));
return s
}
然后你可以像这样进行转换:
{ $NF = hex2str($NF) }
这是一个完整的例子:
<infile awk '
function hex2str(n) {
s = ""
for(i=1; i<=length(n)-2; i+=2)
s = s sprintf("%c", strtonum("0x" substr(n, i, 2)));
return s
}
{ $NF = hex2str($NF) }
1
'
输出:
15 02 2013 12:05:07 [DBG] vspd[3327]: VSP 0: RX E+00024
15 02 2013 12:05:07 [DBG] vspd[3327]: VSP 0: WX E+00024
答案 1 :(得分:0)
Perl解决方案:
#!/usr/bin/perl
while (<>) {
($prefix, $hex) = /^(.*) (.*)$/;
$hex =~ s/(..)/chr hex $1/ge;
print "$prefix $hex\n";
}
输出:
15 02 2013 12:05:07 [DBG] vspd[3327]: VSP 0: RX E+00024
15 02 2013 12:05:07 [DBG] vspd[3327]: VSP 0: WX E+00024
注意:您可能需要从字符串中删除最终的\ x0D。