Bash脚本 - 如何只匹配4字节十六进制值

时间:2016-08-25 17:26:31

标签: linux bash shell sed

我试图从4个字节(32位)十六进制输出中仅过滤一个字节(在xx之后的半字节2和3 - 小端)。 当我执行命令时,我得到以下输出

000023xx

xx会有所不同,并且不会修复。

我正在尝试编写一个bash脚本,以查看我得到的输出是否与23匹配。当我使用以下内容时,它与23xx匹配,其中xx介于2-3之间,但我想在23(小端)之后只匹配xx的内容

实施例

val=231a
echo $val | grep -o -E '[2-3]+' | head -1 | sed -e 's/^0\+//'
23

val=2332
echo $val | grep -o -E '[2-3]+' | head -1 | sed -e 's/^0\+//'
2332

在第二个示例中,我想要输出23

3 个答案:

答案 0 :(得分:2)

您可以单独使用bash执行此操作;不需要其他工具。

val=231a
if [[ $val = *23?? ]]; then
    echo "$val matches"
else
    echo "$val doesn't match"
fi

答案 1 :(得分:0)

您可以在算术扩展中执行AND(&)和右移(>>):

(( ((val >> 8) & 0xFF) == 0x23 )) && echo "value is 23"

小心括号!并使用0x

作为十六进制值的前缀
val=0x231a

代码意味着:

  • 删除最后8位(>> 8),
  • 删除最后8位(& 0xFF)和
  • 之上的任何其他位
  • 将结果与十六进制23(== 0x23)进行比较。

如果结果为true,请执行:echo "value is 23"

如果值实际上是“little endian”,则字符串0000231a的十六进制值为:

val=0x1a230000

代码将是:

(( ((val >> 16) & 0xFF) == 0x23 )) && echo "value is 23"

或者在文本中进行,如果val中的字符串是val=0000231a,只需执行:

[[ val == *23?? ]] && echo "value is 23"

并且,如果要从字符串中提取半字节2和3,请执行:

$ result=${val: -4:2}
$ echo "$result"
23

或更短:

$ echo "${val: -4:2}"
23

答案 2 :(得分:0)

您可以使用Bash正则表达式在一行中完成此操作:

[[ $val =~ 23..$ ]] && echo match