Разное поведение для версий 4.0 и 4.1 при поиске шестнадцатеричных значений в файле с использованием awk - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь найти строку шестнадцатеричных значений в файле, подобном этому:

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

Я уверен, что файл содержит такие значения, как я вижу их в VI (в режиме hexdump)

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

Если я делаю это, используя awk на машине с версией 4.1.3 (Ubuntu 16.04.3 LTS), это работает (возвращает 1). При awk версии 4.0.3 (на машине с Ubuntu 14.04.5 LTS) возвращается 0.

Файл, используемый в обоих случаях, идентичен (фактически смонтирован на NAS на обеих машинах). Я также проверил журнал изменений awk, но безрезультатно.

1 Ответ

0 голосов
/ 19 сентября 2018

Это может быть невозможно с вашими реальными данными, но я смог воспроизвести вашу ошибку и создать заменяющий код, который работает более надежно. Он также должен быть быстрее, поскольку он избегает регулярных выражений.

Сначала давайте создадим воспроизводимый тест:

$ 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

1018 *

[gawk 4.1.4]$ gawk 'index($0, "\x00\x01\x02\x03") { exit 1 }' myfile.bin; echo $?
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...