通过管道将十六进制字符传输到 awk

通过管道将十六进制字符传输到 awk

该命令按预期工作

$ awk 'BEGIN {print "\x41"}'
A

正如这个

$ printf '\x41' | awk '{print}'
A

但是,当您依赖 awk 识别十六进制字符时,它会失败

$ echo '\x41' | awk '{print}'
\x41

如何克服这个问题?

答案1

你需要做类似的事情:

printf '%s\n' '\x41' | 
  awk 'BEGIN{for (i=0;i<0x100;i++) x[sprintf("%02x",i)]=sprintf("%c",i)}
       {print x[tolower(substr($0,3))]}'

awk无法将十六进制字符串直接转换为数字,更不用说字符了。

这种事情在 中做起来要容易得多perl。看这里awk的实施urldecode

作为@terdon 暗示,GNU 实现awk有一个-n|--non-decimal-data选项,允许awk识别输入的十六进制和八进制数字。所以你也可以这样做:

printf '%s\n' '\x41' | gawk -n '{printf "%c\n", +("0x" substr($0,3))}'

gawk还有一个strtonum()功能:

printf '%s\n' '\x41' | gawk -n '{printf "%c\n", strtonum("0x" substr($0,3))}'

相关内容