Арифметические операции со значениями в единицах объема памяти

Найденный вами «ответ» верен, настройка конфигурации прокси для curlproxy, а не http_proxy. Сообщение об ошибке довольно неясно...

Поведение, которое вы видите, когда вы устанавливаете proxy, довольно распространено в корпоративных настройках. :ваш прокси-сервер не поддерживает внутренние сайты, поэтому вам нужно настроить свой прокси-сервер -с помощью инструментов для игнорирования прокси-сервера для внутренних сайтов. (это настройка, обычно выполняемая с помощьюproxy.pac). Чтобы настроить это, вам нужно использовать опцию noproxyи указать через запятую -список хостов и/или доменов, для которых не следует использовать прокси.

9
15.10.2020, 19:25
4 ответа

Немного саморекламы :мы написали библиотеку под названием libbytesize для выполнения этих вычислений на C и Python, а также в ней есть инструмент командной строки под названием bscalc

$ bscalc "5 * (100 GiB + 80 MiB) + 2 * (300 GiB + 15 GiB + 800 MiB)"
1215425413120 B
1186938880.00 KiB
   1159120.00 MiB
      1131.95 GiB
         1.11 TiB

Библиотека входит в состав большинства дистрибутивов, но, к сожалению, инструмент отсутствует. Он есть в Fedora в libbytesize-toolsи SuSE в пакете bscalc, но не в Debian/Ubuntu.

9
18.03.2021, 22:57

Есть Бкал .

$ bcal -m "(5kib+2mib)/2"
1051136 B
$ bcal -m "(5kb+2mb)/2"
1002500 B

Флаг -mпредназначен для краткого вывода. При его удалении выводятся подробные результаты с основанием 2 (КиБ, МиБ, ГиБ, ТиБ )и основанием 10 (кБ, МБ, ГБ, ТБ ).

Он не понимает 86kили 320mили 1.7g, ведь это неправильные единицы байта. В этом случае вы можете использовать Sed, чтобы добавить bпосле каждой буквы, а затем передать его вbcal:

$ cat file
1.7g+320m+86k
$ sed 's/[gmk]/&b/g' file | bcal -m
bcal> 1.7gb+320mb+86kb
2020086000 B

Вы также можете использовать его в интерактивном режиме.

5
18.03.2021, 22:57

В zshвы можете определить математическую функцию, например:

() {
  typeset -gA bsuffix
  local n=1 ni=1 s
  for s (k m g t p e) {
    (( n *= 1000 )); (( ni *= 1024 ))
    (( bsuffix[$s] = bsuffix[${s}ib] = bsuffix[${s}io] = ni ))
    (( bsuffix[${s}b] = bsuffix[${s}o] = n ))
  }
}
b() {
  set -o localoptions -o extendedglob
  local s=${(M)1%(#i)(${(j:|:k)~bsuffix})}
  (( ${1%$s} * ${bsuffix[$s:l]-1} ))
}

functions -Ms b

Тогда вы сможете использовать b(1G), b(1mB)в любом арифметическом выражении zsh, например, в ((.... )), $((... )), $array[...]и т. д.или вzcalc:

$ <<< $((b(86k) + b(320mb) + b(1.7gio)))
2145449164.8

$ autoload zcalc
$ zcalc
1> b(86k) + b(320mb) + b(1.7gio)
2.14545e+09
2> :sci 15
2145449164.8

$ echo $(( b(infeo) ))
Inf   

(обратите внимание, что мы не делаем различий между bиB(или o/ O), соответствие нечувствительно к регистру. Это не интерпретируется как бит против байт).

Другой подход может заключаться в том, чтобы функция b()принимала все выражение в качестве аргумента и заменяла все суффиксы на* $bsuffix[<suffix>]

b() {
  set -o localoptions -o extendedglob
  local s=${(M)1%(#i)(${(j:|:k)~bsuffix})}
  (( ${1//(#bi)([0-9.][[:blank:]]#)(${(j:|:k)~bsuffix})/$match[1] * $bsuffix[$match[2]:l] } ))
}

А потом:

$ echo $(( b(1m + 1Mb) ))
2048576

Существует проблема с e/E(exa ), которая ставит под сомнение работу в том, что 1e-3GBбудет интерпретироваться не как 0.001 * 1000000000, а как 1 * 1152921504606846976 - 3 * 1000000000.

В любой оболочке с поддержкой арифметики с плавающей запятой (ksh93, zsh, yash )всегда можно определить:

  K=1024  M=$((K * K))  G=$((M * K))  T=$((G * K))  P=$((T * K))  E=$((P * K))
KiB=$K  MiB=$M        GiB=$G        TiB=$T        PiB=$P        EiB=$E
 KB=1000 MB=$((KB*KB)) GB=$((MB*KB)) TB=$((GB*KB)) PB=$((TB*KB)) EB=$((PB*KB))

Или играть в гольф:

K=1024 EiB=$((E=K*(P=PiB=K*(T=TiB=K*(G=GiB=K*(M=MiB=K*K))))))
KB=1000 EB=$((EB=KB*(PB=KB*(TB=KB*(GB=KB*(MB=KB*KB))))))

И пиши$(( 1.1*GB + 5*K ))

чтобы добавить суффиксы на выходе, вы можете использовать GNUnumfmt:

$ human() numfmt --field=- --to=iec --suffix=iB
$ echo $(( b(1m + 1Mb) )) | human
2.0MiB
6
18.03.2021, 22:57

(это одна из оболочек для *nix для тех из вас, кому интересно, )встроена -в суффиксах "SI" для числовых литералов , чтобы вы могли использовать их напрямую

PS /home> $f = 5 * (100GB + 80MB) + 2 * (300GB + 15GB + 800MB)
PS /home> $f
1215425413120
PS /home> "In MB: " + $f/1MB
In MB: 1159120
PS /home> "In GB: "; $f/1GB
In GB:
1131.953125
PS /home> "In TB: {0}" -f ($f/1TB)
In TB: 1.10542297363281

Это двоичные префиксы, а не десятичные префиксы, поэтому, если вы хотите использовать десятичные единицы, просто умножьте их на 1eX, чтобы получить желаемое значение

PS /home> 1KB; 1MB; 1GB; 1TB; 1PB
1024
1048576
1073741824
1099511627776
1125899906842624
PS /home> $K = 1e3; $M = 1e6; $G = 1e9
PS /home> 1*$G
1000000000
PS /home> 5 * (100*$G + 80*$M) + 2 * (300*$G + 15*$G + 800*$M)
1132000000000

Вы можете сохранить эти константы в профиле (, аналогичном .bashrcили .bash_profileв bash ), чтобы повторно использовать их каждый раз, когда вы открываете PowerShell

PowerShell на самом деле намного мощнее. Он работает на платформе.NET, поэтому он может делать все, что может делать.NET :математика bigint, десятичная математика, побитовые операции, тригонометрия, дата -вычисления времени...


Поскольку ОП хочет чистый калькулятор , я покажу еще несколько примеров того, как PowerShell можно использовать для этой цели. Приведенные выше математические функции в основном относятся к классу .NET Math и пространству имен Numerics . Вы поместите типы класса.NET внутрь [], например [math]или [system.math]для класса Math(PowerShell нечувствителен к регистру -).Вот некоторые другие вещи, которые могут быть полезны программистам:

  • Побитовые операции (побитовые операции начинаются с -b, за исключением операций сдвига)

    [uint64]::MaxValue/3 + (-bnot 20) + (1L -shl 22) + (0x23 -band 0x34)
    
  • Большое целое математика:[bigint]::Pow([uint64]::MaxValue, 20)

  • Произвольные целые числа и математические выражения с плавающей точкой -

    1.56 + 0.23/[math]::Pow([math]::Sqrt([math]::Log(20) + [math]::Sin([math]::PI/3)), 4)
    
  • Математика для десятичного типа(128 -бит):1.23d * 3.45d / 28

  • Вычисление размера файла или объекта :Использование числовых суффиксов 12.5GB + 5.8MB + 1392KBдля двоичных единиц и 12.5e9 + 5.8e6 + 1392e3для десятичных единиц (G = 1e9, M = 1e6, K = 1e3)

  • Преобразование в/из base64:[Convert]::ToBase64Stringи[Convert]::FromBase64String

  • Дата/время Манипулирование. Например, преобразование необработанных значений эпохи в дату и время и наоборот

      [datetime]::FromFileTime(0x01d15614cbaee92c)
      [datetime]::ParseExact("08-12-2012","dd-MM-yyyy", `
              [Globalization.CultureInfo]::InvariantCulture) 
    
  • Форматирование строк и базовое преобразование. Все, что поддерживаетString.Formatв.NET, будет работать. Для получения дополнительной информации прочитайте об операторе форматирования . Вы также можете выполнять расширенные операции со строками и регулярными выражениями. Некоторые примеры:

      'somestring'.Substring(4) * 3 -replace 'ings', 'eet'
      '{0:X}' -f (0x12 + 34)
      [convert]::ToString(0x12 + 34, 16)
      'This is an emoji' + [char]::ConvertFromUtf32(0x1F60A)
    
  • Прямая обработка XML и JSON

  • Вызов функций в *.SO (*.DLL в файлах Windows )напрямую

  • Программирование графического интерфейса. Вот небольшой пример приложения истории буфера обмена

    PowerShell sample

Для получения дополнительной информации см.

или подпишитесь на блог доктора Скрипто

4
18.03.2021, 22:57

Теги

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