Используя -
поскольку имя файла для значения stdin/stdout является конвенцией, которую использует много программ. Это не специальное свойство имени файла. Ядро не распознает -
как особенный так любые системные вызовы, относящиеся к -
поскольку имя файла будет использовать -
буквально как имя файла.
С перенаправлением удара, -
не распознан как специальное имя файла, таким образом, удар будет использовать это в качестве литерального имени файла.
Когда cat
видит строку -
как имя файла, это рассматривает его как синоним для stdin. Для обхождения этого необходимо изменить строку это cat
видит таким способом, которым это все еще относится к названному файлу -
. Обычный способ сделать это состоит в том, чтобы снабдить префиксом имя файла путь - ./-
, или /home/Tim/-
. Эта техника также используется для обхождения подобных проблем, где параметры командной строки сталкиваются с именами файлов, таким образом, файл, называемый как ./-e
не появляется как -e
параметр командной строки к программе, например.
Использовать hexdump(1)
$ hexdump -x /usr/bin/hexdump
0000000 feca beba 0000 0300 0001 0700 0080 0300
0000010 0000 0010 0000 5080 0000 0c00 0000 0700
0000020 0000 0300 0000 00a0 0000 b06f 0000 0c00
0000030 0000 1200 0000 0a00 0100 0010 0000 107c
0000040 0000 0c00 0000 0000 0000 0000 0000 0000
0000050 0000 0000 0000 0000 0000 0000 0000 0000
...
Другая опция является передозировкой:
od -t x1 FILE
или
od -x FILE
od
имеет много опций для подстройки.
od -t x1
как предпочтительный формат я предполагаю.
– alex
07.04.2011, 19:43
od -t test
Я добрался od: invalid character 't' in type string 'test'
– Tom Brito
11.04.2011, 16:52
od --version od (GNU coreutils) 7.4
– user unknown
11.04.2011, 18:01
В то время как мы идем od
и hexdump
, два более подобных инструмента:
Демонстрационный вывод:
$ hd /usr/bin/od | head
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 03 00 01 00 00 00 20 8e 04 08 34 00 00 00 |........ ...4...|
00000020 a4 a2 00 00 00 00 00 00 34 00 20 00 08 00 28 00 |........4. ...(.|
00000030 1b 00 1a 00 06 00 00 00 34 00 00 00 34 80 04 08 |........4...4...|
00000040 34 80 04 08 00 01 00 00 00 01 00 00 05 00 00 00 |4...............|
00000050 04 00 00 00 03 00 00 00 34 01 00 00 34 81 04 08 |........4...4...|
00000060 34 81 04 08 13 00 00 00 13 00 00 00 04 00 00 00 |4...............|
00000070 01 00 00 00 01 00 00 00 00 00 00 00 00 80 04 08 |................|
00000080 00 80 04 08 c4 9d 00 00 c4 9d 00 00 05 00 00 00 |................|
00000090 00 10 00 00 01 00 00 00 00 a0 00 00 00 20 05 08 |............. ..|
$ xxd /usr/bin/od | head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 0300 0100 0000 208e 0408 3400 0000 ........ ...4...
0000020: a4a2 0000 0000 0000 3400 2000 0800 2800 ........4. ...(.
0000030: 1b00 1a00 0600 0000 3400 0000 3480 0408 ........4...4...
0000040: 3480 0408 0001 0000 0001 0000 0500 0000 4...............
0000050: 0400 0000 0300 0000 3401 0000 3481 0408 ........4...4...
0000060: 3481 0408 1300 0000 1300 0000 0400 0000 4...............
0000070: 0100 0000 0100 0000 0000 0000 0080 0408 ................
0000080: 0080 0408 c49d 0000 c49d 0000 0500 0000 ................
0000090: 0010 0000 0100 0000 00a0 0000 0020 0508 ............. ..
Или, если Вы хотите считать байты по одному и распечатать их в Вашем собственном формате, попробуйте что-то как:
while read -n 1 byte; do
ord=$(printf "%b" "${byte:-\000}" |
od -t x1 |
{ read offset hex; echo $hex; })
echo "$ord"
done </usr/bin/od
Демонстрационный вывод:
7f
45
4c
46
01
01
01
00
00
00
while
цикл не работает на обратную косую черту и символы новой строки (и в ударе (в противоположность ksh93) для символов пробела), и при этом это не будет работать правильно в utf8 локалях для байтов с 8-м набором битов. Кроме того, Вы не должны "отравляться большой дозой наркотика" там, можно использовать printf '%02x\n' "'$byte"
– Stéphane Chazelas
15.10.2012, 23:13
offset
просто своего рода "фиктивная переменная" здесь; это не имеет никакого практического применения. Это просто используется в качестве заполнителя для получения до hex
. Это - то, что иногда влияет на удобочитаемость отрицательным способом с read
: переменные, прибывающие внезапно.
– syntaxerror
02.12.2014, 02:01
$offset
ограничен подоболочкой, таким образом, я не рассматриваю его как проблему.
– Mikel
02.12.2014, 05:44
mc
Полуночный командующий является другой опцией. Я не знаю, доступно ли это для всех разновидностей Unix. Вы, возможно, должны были бы загрузить его сначала.
F3 F4 для просмотра во внутреннем редакторе / в шестнадцатеричном режиме.
Мои два цента:
tail -f streamfile | hexdump -C
Мне нравится это, потому что Вы выслеживаете в настоящее время буферизующий файл в то время как способность видеть, что hexdump живет. Не забывайте, что ВСЕ в Unix - файл, и мы можем легко объединить команды в цепочку как tail
и hexdump
решить большое разнообразие проблем.
for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&
это работает хорошо на контроль спасибо :)
– Aquarius Power
20.11.2014, 17:56
Я использую od с c и x1, когда мне нужно искать текст внутри бинарного файла:
$ echo "Some text..." | od -t c -t x1
0000000 S o m e t e x t . . . \n
53 6f 6d 65 20 74 65 78 74 2e 2e 2e 0a
0000015
Если данные, которые вы просматриваете, в основном представляют собой текст с редкими двоичными файлами, вы можете найти вариант -v
для cat(1)
удобным:
$ printf 'here is\x00\x01some text\x15\x16with the odd bit\x80\x81of binary mixed in' | cat -v
here is^@^Asome text^U^Vwith the odd bitM-^@M-^Aof binary mixed in
Непечатаемые байты -≤ 0x7f
отображаются с обозначением управляющих символов -. Байты ≥ 0x80
имеют префикс M-
.
Это необратимо, так как M-
сам по себе не экранирован. Тем не менее, его легче читать, чем полный канонический шестнадцатеричный формат дампа, предоставляемый hd(1)
и другими инструментами.
od
. Существует также названный Hex-редактор vi-стиляhexer
. – LawrenceC 07.04.2011, 17:47hexdump -e '"\\\x" /1 "%02x"' filename
– Aquarius Power 20.11.2014, 18:10