【问题标题】:How to compare hex values using AWK?如何使用 AWK 比较十六进制值?
【发布时间】:2021-05-10 03:56:59
【问题描述】:

考虑使用以下程序过滤0x10 - 0xa0 范围内的十六进制数。

echo -e "0x10\n0xff\n0x16\n0x80\n0x50" | awk '$1 >= 0x10 && $1 <= 0xa0 { print $0 }'

如果我使用十进制等效值替换所有数字,但程序会正常工作,但使用十六进制数字会失败。

我使用的 awk 版本不支持 --non-decimal-data - 这是 Debian 10 Buster 附带的默认版本。

如何使用十六进制数字进行比较?

【问题讨论】:

  • 十六进制数的取值范围是多少? 0x00 到 0xff 或更大?

标签: awk debian


【解决方案1】:

awkstrtonum function 用于从 hexdecimal 的转换:

echo -e "0x10\n0xff\n0x16\n0x80\n0x50" |
awk '{n = strtonum($1)} n >= 0x10 && n <= 0xa0'

0x10
0x16
0x80
0x50

在没有gnu awk 的情况下,您也可以使用这个perl 一个班轮:

echo -e "0x10\n0xff\n0x16\n0x80\n0x50" |
perl -lane 'print if hex($F[0]) >= 0x10 && hex($F[0]) <= 0xa0'

【讨论】:

  • 一个问题是数字可能太大以至于它们被解释为负整数,这是一个问题。另外,您确定strtonumawk 的所有版本中都可用吗?
  • 抱歉 strtonum 不适用于所有 awk
  • 是的,我的awk 抱怨它不存在:(
  • 请尝试perl替代
【解决方案2】:

一个技巧是进行字符串比较。由于“a”>“9”,这将起作用

$ echo -e "0x10\n0xff\n0x16\n0x80\n0x50" | 
  awk '$1 >= "0x10" && $1 <= "0xa0"'


0x10
0x16
0x80
0x50

【讨论】:

  • 如果数字长度不同,这不会失败吗?即0x1000 小于0x80 使用字符串比较?
  • 对,这不是通用解决方案,而是针对具有相同固定长度的数字子集的有效破解。
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多