Calculador de linha de comando simples

9

Problema:

De vez em quando, preciso fazer aritmética simples em um ambiente de linha de comando. POR EXEMPLO. dada a seguinte saída:

Disk /dev/sdb: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  106MB   105MB   fat32                 hidden, diag
 2      106MB   64.1GB  64.0GB  ext4
 3      64.1GB  192GB   128GB   ext4
 5      236GB   256GB   20.0GB  linux-swap(v1)

Qual é uma maneira simples de calcular na linha de comando o tamanho do espaço não alocado entre as partições 3 e 5?

O que eu já tentei:

bc

bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type 'warranty'. 
236-192
44
quit

onde o negrito acima é tudo o que preciso digitar para fazer um simples 236-192 como bc 1+1 echoes File 1+1 is unavailable.

expr

expr 236 - 192

em que preciso digitar espaços antes e depois do operador, pois expr 1+1 apenas ecoa 1+1 .

    
por Fabby 06.11.2018 / 15:33

12 respostas

22

Você pode reduzir bastante a quantidade de verbosidade envolvida no uso de bc :

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2

(assumindo que seu shell suporta isso).

Se você preferir ter isso como uma função:

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

Armazene a definição c no seu arquivo de inicialização do shell favorito, se quiser torná-lo sempre disponível.

    
por 06.11.2018 / 16:30
16

Ao ler comentários das páginas , vejo Programa UNIX / Linux chamado calc que faz exatamente o que você deseja. Se no Debian / Ubuntu / derivados:

sudo apt-get install apcalc

então você pode:

calc 236-192

e se você adicionar um alias alias c='calc' ao seu .bashrc ou /etc/bash.bashrc , ele se tornará:

c 1+1

na linha de comando.

    
por 06.11.2018 / 16:15
11

Em zsh :

$ autoload zcalc # best in  ~/.zshrc
$ zcalc
1> 1+1
2
2> ^D
$ zcalc 5+5
1> 10
2>
    
por 06.11.2018 / 16:36
7

O programa units , embora não se destine a ser usado como uma calculadora , na verdade funciona razoavelmente bem como um.

$ units "236-192"
    Definition: 44
$ 

Se houver espaços na expressão, a expressão deverá ser protegida por citações.
Suporta exponenciais e aninhamento profundo de colchetes

    
por 06.11.2018 / 21:42
7

Shell

O mais simples calc na CLI é o próprio CLI (shell) (se IFS for o padrão):

$ echo $(( 22 + 333 ))
355

Espaços podem ser omitidos:

$ echo $((22*333))
7326

Como é parte do POSIX quase tudo conchas têm isso. E inclui mais da funcionalidade matemática da linguagem C (exceto que zsh tem uma precedência diferente, configure C_PRECEDENCES para restaurá-lo para um valor compatível):

$ echo $((22*333^2))
7324

E alguns shells têm a maior parte da sintaxe matemática da linguagem C (incluindo vírgula):

$ echo $((a=22,b=333,c=a*b,c))
7326

Mas é apenas matemática inteira (e geralmente menos de 2 63 nos sistemas operacionais atuais) em alguns shells:

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808

Algumas conchas podem fazer matemática flutuante:

$ ksh -c 'echo $((1234/3.0))'
411.333333333333333

$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21

Evite zsh (zcalc tem problemas semelhantes):

$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259

Eu recomendo que você evite expr , ele precisa de fugas estranhas, às vezes:

$ expr 22 \* 333
7326

bc

No próximo nível é ( também POSIX ) bc (primo de RPN dc )

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

O dc foi POSIX, mas foi removido em 2017 .

Mais curto se o seu shell for compatível:

$ bc <<<'22*333'
7326

Ou até mesmo:

$ <<<'22*333' bc
7326

Ambos são calculadores de precisão arbitrária com algumas funções matemáticas internas:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

$ echo 's(3.1415/2)' | bc -l        # sine function
.99999999892691403749

awk

Depois dessas ferramentas calcárias realmente básicas , você precisa ir para outros idiomas

$ awk "BEGIN {print (22*33)/7}"
103.714

$ perl -E "say 22*33/7"
103.714285714286

$ python3 -c "print(22*33/7)"
103.71428571428571

$ php -r 'echo 22*33/7,"\n";'
103.71428571429

função

Você pode definir uma função de qualquer uma das opções acima:

c () 
{ 
    local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
    gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}

E use:

$ c 22* 33 /7                   # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714
    
por 07.11.2018 / 11:02
6

O que eu faço no zsh é:

$ <<< $(( 236 - 192 ))
44

No bash, eu teria que mencionar explicitamente o gato:

$ cat <<< $(( 236 - 192 ))
44

Se eu quisesse que o resultado incluísse dígitos fracionários (funciona em zsh, não em bash), adicionaria um ponto de raiz a um dos operandos

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375
    
por 06.11.2018 / 18:41
5

Como observado em um comentário para uma resposta anterior, o shell padrão (ba) sh permite avaliar expressões aritméticas dentro de $((...)) . Eu não pude verificar novamente se isso é parte do padrão POSIX, mas verifiquei se ele também funciona no Cygwin e no shell Mingw32.

Para ver o resultado, você realmente precisa digitar echo $((...)) , o que torna alguns caracteres mais do que (uso interativo de) bc . No entanto, para usar o resultado em um script, isso provavelmente será mais curto do que a bc solution (que pode ser, por exemplo, 'echo ...|bc' ).

Em relação à verbosidade, o comando bc permite a opção -q que suprime a saída do "normal GNU bc welcome" .

Como observação final, ligeiramente limítrofe, vamos observar que bc não é apenas uma calculadora, mas sim uma linguagem de programação completa (incluindo funções definidas pelo usuário, enquanto loops, etc.etc). Outro fato que sugere preferir as capacidades aritméticas embutidas para cálculos tão simples, em vez de um programa externo. Dito isso, extrair os dados para determinado (s) número (s) de partição e lidar com sufixos "M", "G", como a pergunta original parecia solicitar, poderia chamar (g)awk em vez de bc .

Fontes: link   link

    
por 07.11.2018 / 01:06
4

Pessoalmente, gosto de libqalculate (a versão de linha de comando de Qalculate ).

$ qalc
> 236-192

  236 - 192 = 44

(Lib) qalculate é uma calculadora poderosa e completa. por exemplo,

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

Ele também faz coisas úteis, como preenchimento de guias, parênteses de abertura / fechamento quando necessário e imprime sua interpretação da consulta.

> 18-2)/4

  (18 - 2) / 4 = 4

Para sair, basta pressionar Ctrl + d .

Para um acesso ainda mais rápido, defina-o como alias ca='qalc' .

    
por 06.11.2018 / 22:26
3

Python abre em outra aba?

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on 
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 3+3
6
>>>
    
por 06.11.2018 / 21:54
2

dc -e '236 192-p'

... claro, se você não estiver familiarizado com dc e precisar de mais do que subtraindo dois números, você gastará mais tempo pesquisando como usar dc (e talvez RPN em geral) do que você Economize com métodos mais familiares.

    
por 07.11.2018 / 03:32
2

Se você tem gradle instalado, então você tem groovy ...

Se o groovy for direcionado corretamente, você poderá usar:

groovy -e "println 1+1"

Isso pode parecer um pouco redundante com todos os outros exemplos, mas:

  • groovy é uma linguagem poderosa
  • possivelmente o melhor suporte a bibliotecas disponível
  • funções matemáticas poderosas e simples (como matemática de precisão arbitrária)
  • usa stdout redirecionável para sua saída, por isso é incrivelmente flexível (ótimo para usar dentro de arquivos em lote com backticks '' e similares).

Se você não tem o java instalado, provavelmente não vale a pena instalar groovy & java - é apenas uma opção se o groovy já estiver disponível.

    
por 06.11.2018 / 23:06
1

Acabei criando o script /usr/local/bin/c contendo:

#!/bin/sh
IFS=' '               # to be on the safe side, some shells fail to reset IFS.
if [ "$#" -eq 0 ];  then
    echo "$(basename "$0"): a (very) simple calculator."
    echo "type $(basename "$0") expression to evaluate (uses bc internally)"
fi

printf '%s\n' "$*" | bc -l  # safe for most shells
                            # we may use 'bc -l <<<"$*"' for ksh, bash, zsh

então: digitando c 1+1 yields 2 ! : -)

Nota 1: usei c porque esse comando não existe em nenhum sistema Unix que eu possa encontrar. Se você tivesse aliasmente isso ao seu compilador c, usasse qualquer outra coisa que fosse curta e você não usasse.
Nota 2: Fonte

    
por 06.11.2018 / 15:33