0

我有一个看起来像这样的文件:

.
.
.
    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

串口通信的嗅探器日志。

如何自动将十六进制字符代码转换为字符串?

我试图使用这样的东西:

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}'

变成可读的东西?

4

2 回答 2

1

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。

于 2013-02-15T08:32:46.520 回答
1

您确实可以使用awkand到达那里xxd,这是一个示例:

<infile awk -F'(RX|WX)[[:space:]]*' '{ print $2 }' | xxd -p -r | awk 1 RS='\r'

输出:

E+00024
E+00024

旧答案

使用 GNU awk,您可以strtonum()用来转换十六进制,例如:

function hex2str(n) {
  s = ""
  for(i=1; i<=length(n)-1; 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)-1; 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
于 2013-02-15T09:08:33.693 回答