[英]Parse log containing hex character codes using awk or xxd or something
我有一個看起來像這樣的文件:
.
.
.
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}'
變成可讀的東西?
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。
您確實可以使用awk
和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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.