Существует ли стандартный инструмент, который преобразует целое число байтов в удобочитаемый счетчик максимально возможного размера блока, сохраняя при этом числовое значение от 1,00 до 1023,99?
У меня есть свой собственный скрипт bash / awk, но я ищу стандартный инструмент, который можно найти во многих / большинстве дистрибутивов ... что-то более общедоступное, в идеале он имеет простые аргументы командной строки и / или может принимать ввод по трубопроводу.
Вот несколько примеров типа вывода, который я ищу.
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Вот скрипт bytes-human (используется для вывода выше)
awk -v pfix="$1" -v sfix="$2" 'BEGIN {
split( "Byt KiB MiB GiB TiB PiB", unit )
uix = uct = length( unit )
for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
}{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
num = $1 / (val[uix]+1)
if( uix==1 ) n = "%5d "; else n = "%8.2f"
printf( "%s"n" %s%s\n", pfix, num, unit[uix], sfix )
}'
Обновление Вот модифицированная версия сценария Жиля , как описано в комментарии к его ответу (изменена в соответствии с моим предпочтительным видом).
awk 'function human(x) {
s=" B KiB MiB GiB TiB EiB PiB YiB ZiB"
while (x>=1024 && length(s)>1)
{x/=1024; s=substr(s,5)}
s=substr(s,1,4)
xf=(s==" B ")?"%5d ":"%8.2f"
return sprintf( xf"%s\n", x, s)
}
{gsub(/^[0-9]+/, human($1)); print}'
text-processing
utilities
units
Peter.O
источник
источник
standard tool
в процессе :)Ответы:
Нет, такого стандартного инструмента не существует.
Начиная с GNU coreutils 8.21 (февраль 2013 г. (пока еще не представлен во всех дистрибутивах), на не встроенных Linux и Cygwin вы можете использовать
numfmt
. Он не выдает точно такой же формат вывода (как и в случае с coreutils 8.23, я не думаю, что вы можете получить 2 цифры после десятичной точки).Многие старые инструменты GNU могут создавать этот формат, а сортировка GNU может сортировать числа с единицами начиная с coreutils 7.5 (август 2009 года, поэтому присутствует в современных не встроенных дистрибутивах Linux).
Я нахожу ваш код немного запутанным. Вот более чистая версия awk (формат вывода не совсем идентичен):
( Перенесено из более специализированного вопроса )
источник
s
должна быть ведущая рольB
. Также эта строка легко заменяется двоичной нотацией IEC. (2) Он пропускает диапазон 1000-1023 в пользу 1 <следующий размер> (легко изменяется) (3) У него нет десятичных значений (что я хочу). Опять же это легко изменить. При отображении 2 десятичных знаков%f
формат приводитround-up
к значению <следующий размер> для значений 1019-1023 ; но это не стоит обходного пути. Я опубликовал измененную версию в своем ответе для общего ознакомления.du
числа в понятный человеку формат, обратите внимание, что вам может потребоваться добавить--block-size=1
вdu
команду.По состоянию на
8.21
,coreutils
включает в себяnumfmt
:например
Различные другие примеры (включая фильтрацию, обработку ввода / вывода и т. Д.) Представлены ЗДЕСЬ .
Кроме того, по состоянию на
coreutils
ст.8.24
,numfmt
Может обрабатывать несколько полей с характеристиками диапазона поля , подобныхcut
, и поддерживает настройки выходной точности с--format
опцией ,например ,
источник
Вот опция bash-only, нет
bc
или любые другие не встроенные, + десятичный формат и двоичные единицы.Примеры:
Должен хорошо работать на любой версии Bash (включая MSYGit Bash для Windows).
источник
Это полное переписывание, вдохновленное измененной версией сценария Жиля Питера.
Изменения:
Код:
Тестовые случаи (если вы хотите посмотреть на вывод):
Наслаждайтесь!
источник
В
perl
CPAN есть несколько модулей: Format :: Human :: Bytes и Number :: Bytes :: Human , последний из которых немного более полон:И наоборот:
ПРИМЕЧАНИЕ: функция
parse_bytes()
была добавлена в версии 0.09 (2013-03-01)источник
Через Linux - Есть ли калькулятор командной строки для вычисления байтов? - Переполнение стека , я нашел о единицах GNU - хотя без примеров на странице SO; и так как я не увидел его здесь, вот небольшая заметка об этом.
Сначала проверьте, присутствуют ли единицы:
Учитывая, что они есть, сделать преобразование -
printf
спецификаторы формата принимаются для форматирования числового результата:источник
На самом деле, есть утилита, которая делает именно это. Я знаю, потому что это я написал. Он был написан для * BSD, но должен компилироваться в Linux, если у вас есть библиотеки BSD (которые, я считаю, распространены).
Я только что выпустил новую версию, размещенную здесь:
http://blog.frankleonhardt.com/2015/freebsd-hr-utility-human-readable-number-filter-man-page/
Он называется hr, и он возьмет stdin (или файлы) и преобразует числа в удобочитаемый формат таким образом, который (сейчас) точно такой же, как ls -h и т. Д., И может выбирать отдельные каналы в строках, масштабировать предварительно масштабированные единицы (например, если они находятся в 512-байтовых блоках, преобразуют их в Мб и т. д.), настраивают заполнение столбцов и т. д.
Я написал это несколько лет назад, потому что я думал, что попытка написать сценарий оболочки, хотя интеллектуально интересная, была также полным безумием.
Используя, например, hr, вы можете легко получить отсортированный список размеров каталогов (которые выходят в единицах по 1 КБ и нуждаются в смещении перед преобразованием) со следующим:
du -d1 | сортировать -n | hr -sK
Пока du выдаст -h, sort не будет сортировать по нему. Добавление -h к существующим утилитам является классическим случаем несоблюдения философии Unix: иметь простые утилиты, выполняющие определенные задачи действительно хорошо.
источник
Вот способ сделать это почти чисто в bash, просто требуется 'bc' для математики с плавающей запятой.
Использование:
Выход:
источник
дает:
К сожалению, я не могу понять, как получить точность в два десятичных знака. Проверено на Ubuntu 14.04.
источник
Первый ответ @ don_crissti хорош, но может быть еще короче, используя Here Strings , например
или даже
если
<<<
не доступен, вы можете использовать, например,источник
Существуют инструменты Python
Я не вижу флага --binary :(, поэтому вам придется использовать python напрямую для двоичного представления:
источник
У меня была такая же проблема , и я быстро придумал простое решение с использованием
awk
«slog()
функции:И точность, потерянная при использовании чисел с плавающей точкой, не так уж и плоха, так как эта точность все равно будет потеряна.
источник
Ответ на ваш вопрос - да.
Хотя выходной формат не совсем соответствует вашей спецификации, само преобразование легко выполняется очень стандартным инструментом (или двумя) . Те, на которые я ссылаюсь,
dc
иbc
. Вы можете получить сегментированный отчет, изменив их выходные радиусы. Нравится:... который печатает ...
Я использую
dc
выше, потому что это личный фаворит, ноbc
может делать то же самое с другим синтаксисом и придерживается тех же правил формата, как указано в POSIX, например:bc
obasebc
пишутся двузначные десятичные числа; для базисов от 101 до 1000, трехзначных десятичных строк и т. д. Например, десятичное число 1024 в базе 25 будет записано как:01 15 24
и в базе 125, как:
008 024
источник
Короткое и сладкое, решение только для раковин:
Это не показывает десятичное зелье.
Это
let VAR=expression
корниш. ЗаменитьVAR=$(( expression ))
на Born-again-ish.источник
AFAIK нет такого стандартного инструмента, к которому вы можете передавать текст, и он возвращает удобочитаемую форму. Возможно, вы сможете найти пакет для выполнения указанной задачи для вашего дистрибутива.
Однако я не понимаю, почему вам может понадобиться такой инструмент. Большинство пакетов, которые дают связанный вывод, обычно имеют переключатель -h или эквивалентный для удобочитаемого вывода.
источник