Sí, mi suposición parece correcta, según este documento :https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md
Dice:
# Should I use backticks?
# Command substitutions also come in this form:
Correct: "`cmd`"
Bad: `cmd`
Использование Perl для распаковки выделенного файла в массив байтов, а затем использование хэша для подсчета уникальных байтов:
printf '\xA0\x01\x00\xFF\x77\x01\x77\x01\xA0' |
perl -0777 -nE '
@bytes = unpack("C*",$_)
}{
$counts{$_}++ for @bytes;
for $k (sort { $a <=> $b } keys %counts) {
printf "%02X: %d\n", $k, $counts{$k}
}
'
00: 1
01: 3
77: 2
A0: 2
FF: 1
Если доступна достаточно свежая версия List::MoreUtils
, вы можете упростить подсчет, используя ее функцию frequency
.
< my_binary_file xxd -p | fold -w 2 | sort | uniq -c
1 00
3 01
2 77
2 a0
1 ff
< my_binary_file xxd -p | fold -w 2 | sort | uniq -c | awk '{print $2": "$1}'
00: 1
01: 3
77: 2
a0: 2
ff: 1
< my_binary_file
передает содержимое my_binary_file
на стандартный ввод команды xxd
. xxd -p
преобразует данные, считанные со стандартного ввода, в шестнадцатеричный дамп, а модификатор-p
(plain )указывает программе выводить только цифры без смещений и текстового представления. fold -w 2
вставляет символ новой строки через каждые два символа (-w 2
), преобразуя входной поток в список байтов, разделенных новой строкой -. sort
, как следует из названия, сортирует строки, группирующие значения байтов. uniq -c
подсчитывает количество вхождений каждого значения во входных данных. awk
преобразует выходной формат в запрошенный в исходном сообщении. Если файл очень большой, вы можете считать и сортировать по ходу
od -t x1 -w1 -v -An binaryfile |
awk '{h[$1]++} END {for (v in h) {printf "%d\t%s\n", h[v], v} }' |
sort -k2
Если вам нужно решение POSIX
od -t x1 -v -An binaryfile |
tr ' ' '\n' |
awk '$1 > "" { h[$1]++ } END { for (v in h) {printf "%d\t%s\n", h[v], v} }' |
sort -k2