如何使用awk从二进制文件中提取版本号

时间:2011-04-13 20:33:22

标签: regex awk

我曾试图从二进制文件中提取版本号 版本号在此字符串'VeRsIoN_StRiNg'之后。
但是如何使用awk找到它并打印我无法找到的下一个字符。

有人可以帮忙吗?

/拉塞

3 个答案:

答案 0 :(得分:1)

你是否真的需要使用awk?对于grep --binary-files=text -o 'VeRsIoN_StRiNg.' file | grep -o '.$'来说,这似乎是一个更好的用例。

我不完全确定像awk这样的流编辑器实际上如何使用二进制文件。如果这是更大的awk脚本的一部分,你可能想从awk调用上面的grep公式。

答案 1 :(得分:1)

您可以使用 strings 命令在对象或其他二进制文件中查找可打印的字符串

strings /path/to/binary | grep -o 'VeRsIoN_StRiNg.' | grep -o '.$'

答案 2 :(得分:0)

为什么不用awk?

gawk -b/mawk/mawk2 'BEGIN { RS = "^$"; FS = "^.*VeRsIoN_StRiNg" 

    } END { print substr($2,1,1)' # mawk/mawk2 or gawk in byte mode. 
                                  # LC_ALL=C gawk -e will be here too

即使在 gawk unicode 模式下,这个解决方法也行

gawk -e 'BEGIN { RS = "^$"; FS = "^.*VeRsIoN_StRiNg" 

    } END { printf("%.1s\n", $2) }' # gawk in unicode mode

这是为了利用为 %s 指定的“精度”N(例如 %.ns)意味着

最多打印 N 个项目

但是由于根据 FS 的定义,我们知道 $2 的第一个字节已经是您的版本号,一个单字符整数,那么这个 printf 将绕过任何抱怨试图在 UTF8 不合规数据上执行子字符串的 gawk 错误消息。