путаница с байтом перевода строки ASCII в команде awk + xxd bash - PullRequest
1 голос
/ 02 марта 2020

Я не совсем понимаю, что некоторые 0a (то есть NL ASCII-байт) встречаются в некоторых bash командах. На следующем:

$ echo | sha1sum $1 | awk '{print $1;}' | xxd -r -ps > test.bin
$ echo | sha1sum $1 | awk '{print $1;}' > test.hex
$ xxd test.bin
00000000: adc8 3b19 e793 491b 1c6e a0fd 8b46 cd9f  ..;...I..n...F..
00000010: 32e5 92fc                                2...
$ xxd test.hex
00000000: 6164 6338 3362 3139 6537 3933 3439 3162  adc83b19e793491b
00000010: 3163 3665 6130 6664 3862 3436 6364 3966  1c6ea0fd8b46cd9f
00000020: 3332 6535 3932 6663 0a                   32e592fc.

что отвечает за наличие байта 0a в test.hex, но не в test.bin?

Примечание 1 : это вопрос, который я задавал себе, следуя используемому там решению:

Дамп вывода `` `sha``` контрольной суммы на диск в двоичном формате вместо незашифрованного шестнадцатеричного текста в bash

Примечание 2 : я могу подавить байт 0a, это не вопрос, мне просто интересно, почему он присутствует в одном случае, но не другое:

$ echo | sha1sum $1 | awk '{print $1;}' | head -c-1 > test_2.hex
$ xxd test_2.hex
00000000: 6164 6338 3362 3139 6537 3933 3439 3162  adc83b19e793491b
00000010: 3163 3665 6130 6664 3862 3436 6364 3966  1c6ea0fd8b46cd9f
00000020: 3332 6535 3932 6663                      32e592fc

1 Ответ

2 голосов
/ 02 марта 2020

0a, который вы видите, исходит от awk. По умолчанию выходной разделитель записей для awk равен \n, и вы можете удалить его, установив ORS (например, с помощью BEGIN {ORS=""}).

Вы потеряете его, когда Вы передаете через xxd -r -ps из-за параметра -r. Со страницы руководства: «Дополнительные пробелы и разрывы строк разрешены где угодно».

...