管道十六进制字符到 awk

Ste*_*nny 3 bash awk

此命令按预期工作

$ awk 'BEGIN {print "\x41"}'
A
Run Code Online (Sandbox Code Playgroud)

像这样

$ printf '\x41' | awk '{print}'
A
Run Code Online (Sandbox Code Playgroud)

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

$ echo '\x41' | awk '{print}'
\x41
Run Code Online (Sandbox Code Playgroud)

如何克服?

Sté*_*las 5

您需要执行以下操作:

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))]}'
Run Code Online (Sandbox Code Playgroud)

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))}'
Run Code Online (Sandbox Code Playgroud)

gawk还有一个strtonum()功能:

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