版本4.0和版本的不同行为4.1使用awk

时间:2018-04-27 06:48:50

标签: bash ubuntu awk

我试图在这样的文件中找到一串十六进制值:

$ awk '/\x00\x01\x02\x03/ {exit 1;}' myfile.bin
$ echo $?

我确信该文件包含这些值,因为我可以在VI中看到它们(在hexdump模式下)

00000000: ad33 0215 0001 0203 e1fa 8f76 1941 cd07  ....
......

如果我在版本为4.1.3(Ubuntu 16.04.3 LTS)的机器上使用awk执行此操作,则可以正常工作(返回1)。使用awk版本4.0.3(在Ubuntu 14.04.5 LTS机器上),它返回0.

两种情况下使用的文件都是相同的(实际安装在两台机器的NAS上)。我还检查了awk的更改日志,但无济于事。

1 个答案:

答案 0 :(得分:1)

使用您的真实数据可能无法实现,但是我能够重现您的错误并创建更可靠地工作的替换代码。还应该更快,因为它避免了正则表达式。

首先,让我们创建一个可重现的测试:

$ awk 'BEGIN{printf "%c%c%c%c", 0, 1, 2, 3}' > myfile.bin
$ hexdump -C myfile.bin
00000000  00 01 02 03                                       |....|
00000004

好的,现在我们可以测试一下:

[gawk 4.0.2]$ gawk --version |awk NR==1
GNU Awk 4.0.2
[gawk 4.0.2]$ gawk '/\x00\x01\x02\x03/ {exit 1}' myfile.bin; echo $?
0

在另一个系统上:

[gawk 4.1.4]$ gawk --version |awk NR==1
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)
[gawk 4.1.4]$ gawk '/\x00\x01\x02\x03/ {exit 1}' myfile.bin; echo $?
1

转载。

让我们使用index()代替正则表达式:

[gawk 4.0.2]$ gawk 'index($0, "\x00\x01\x02\x03") { exit 1 }' myfile.bin; echo $?
1

[gawk 4.1.4]$ gawk 'index($0, "\x00\x01\x02\x03") { exit 1 }' myfile.bin; echo $?
1