Как посчитать количество байтов в файле, группируя одинаковые байты?

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`

5
29.06.2019, 04:51
4 ответа

Здесь используется или для отображения одного шестнадцатеричного значения в строке, затем выполняется сортировка и подсчет:

od -t x1 -w1 -v -An mybinaryfile | sort | uniq -c

(-w1является расширением, оно не требуется POSIX .)

19
27.01.2020, 20:31

Использование 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.

5
27.01.2020, 20:31
  • < 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преобразует выходной формат в запрошенный в исходном сообщении.
0
27.01.2020, 20:31

Если файл очень большой, вы можете считать и сортировать по ходу

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
0
31.03.2020, 11:56

Теги

Похожие вопросы