AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 480121
Accepted
Fabby
Fabby
Asked: 2018-11-07 06:33:55 +0800 CST2018-11-07 06:33:55 +0800 CST 2018-11-07 06:33:55 +0800 CST

Calculadora de linha de comando simples

  • 772

Questão:

De vez em quando eu preciso fazer aritmética simples em um ambiente de linha de comando. EG dado 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 a partição 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-192como bc 1+1echoesFile 1+1 is unavailable.

exp

expr 236 - 192

onde eu preciso digitar espaços antes e depois do operador como expr 1+1apenas ecos 1+1.

shell calculator
  • 21 21 respostas
  • 73135 Views

21 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-11-07T07:30:52+08:002018-11-07T07:30:52+08:00

    Você pode reduzir 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 -l; }
    $ c 1+1 22/7
    2
    3.14285714285714285714
    

    ( -lhabilita a biblioteca matemática padrão e aumenta a escala padrão para 20.)

    Armazene a cdefinição em seu arquivo de inicialização de shell favorito se desejar disponibilizá-la sempre.

    • 70
  2. user232326
    2018-11-08T02:02:13+08:002018-11-08T02:02:13+08:00

    Resumo

    Existem várias soluções listadas (shell, awk, dc, perl, python, etc.).

    Uma função pode ser definida com qualquer opção (gawk parece ser a mais flexível de usar)

    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 como:

    $ c 236- 192
    44
    

    Casca

    O calc mais simples no CLI é o próprio CLI (shell) (If IFSé o padrão):

    $ echo $(( 22 + 333 ))
    355
    

    Os espaços podem ser omitidos:

    $ echo $((22*333))
    7326
    

    Como faz parte do POSIX , quase todos os shells o possuem. E inclui a maioria das funcionalidades matemáticas da linguagem C (exceto que zsh tem uma precedência diferente, defina 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
    

    Alguns shells podem fazer matemática flutuante:

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

    Evite o zsh (o 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 escapes estranhos às vezes:

    $ expr 22 \* 333
    7326
    

    bc

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

    $ echo '22*333' | bc
    7326
    
    $ echo '22 333 * p' | dc
    7326
    

    O dc foi (historicamente) usado para implementar o bc e foi excluído do POSIX em 2017 .

    Mais curto se o seu shell suportar:

    $ bc <<<'22*333'
    7326
    

    Ou ainda:

    $ <<<'22*333' bc
    7326
    

    Ambas são calculadoras 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 de cálculo 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
    
    • 41
  3. number9
    2018-11-07T07:15:14+08:002018-11-07T07:15:14+08:00

    Lendo os comentários desta página , vejo um programa UNIX/Linux chamado calcque faz exatamente o que você deseja. Se no Debian / Ubuntu / derivados:

    sudo apt-get install apcalc
    

    ou no Fedora Linux:

    sudo dnf install calc
    

    então você pode:

    calc 236-192
    

    e se você adicionar um alias alias c='calc'ao seu .bashrcou /etc/bash.bashrcentão ele se torna:

    c 1+1
    

    na linha de comando.

    • 28
  4. Stéphane Chazelas
    2018-11-07T07:36:59+08:002018-11-07T07:36:59+08:00

    Em zsh:

    $ autoload zcalc # best in  ~/.zshrc
    $ zcalc
    1> 1+1
    2
    2> ^D
    $ zcalc 5+5
    1> 10
    2>
    
    • 18
  5. Sparhawk
    2018-11-07T13:26:44+08:002018-11-07T13:26:44+08:00

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

    $ qalc
    > 236-192
    
      236 - 192 = 44
    

    Embora a interface seja certamente simples, (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 tabulação, abrir/fechar parênteses 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 para algo como alias ca='qalc'.

    • 11
  6. CSM
    2018-11-07T12:42:59+08:002018-11-07T12:42:59+08:00

    O unitsprograma, embora não tenha a intenção de ser usado como uma calculadora, na verdade funciona muito bem como uma.

    $ units "236-192"
        Definition: 44
    $ 
    

    Se houver espaços na expressão, a expressão deverá ser protegida por aspas.
    Ele suporta exponenciais e aninhamento profundo de colchetes

    • 10
  7. JoL
    2018-11-07T09:41:29+08:002018-11-07T09:41:29+08:00

    O que eu faço no zsh é:

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

    No bash, eu teria que mencionar explicitamente cat:

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

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

    $ <<< $(( 236 / 128 )) 
    1
    $ <<< $(( 236. / 128 ))
    1.84375
    
    • 7
  8. Max
    2018-11-07T16:06:30+08:002018-11-07T16:06:30+08:00

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

    Para ver o resultado, você realmente teria que 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 que a bcsolução (que pode ser, por exemplo, `echo ...|bc`).

    Com relação à verbosidade, o bccomando permite a opção -qque suprime a saída do "normal GNU bcwelcome" .

    Como uma observação final, ligeiramente limítrofe, vamos notar que bcnão é apenas uma calculadora, mas sim uma linguagem de programação completa (incluindo funções definidas pelo usuário, loops while & for, etc etc.). Outro fato que sugere preferir os recursos aritméticos embutidos para cálculos tão simples, em vez de um programa externo. Dito isto, extrair os dados para determinado(s) número(s) de partição e lidar com sufixos "M", "G", como a pergunta original parecia pedir, pode exigir em (g)awkvez de bc.

    Fontes: https://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html

    • 7
  9. Michael Hearn
    2018-11-07T12:54:19+08:002018-11-07T12:54:19+08:00

    Python aberto em outra guia?

    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
    >>>
    
    • 6
  10. Jan M.
    2019-04-25T00:44:36+08:002019-04-25T00:44:36+08:00

    Já tentou concalc ?

    Descrição: calculadora de console concalc é uma calculadora para o console Linux. É apenas o algoritmo analisador do extcalc compactado em um programa de console simples. Você pode usá-lo se precisar de uma calculadora em seu shell. O concalc também é capaz de executar scripts escritos em uma linguagem de programação semelhante a C.

    $ concalc 1+1
    2
    $ concalc sqrt2
    1.41421356237309505
    

    Instale com:

    sudo apt-get install concalc
    
    • 4

relate perguntas

  • Como funciona este comando? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

  • FreeBSD's sh: funções de lista

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • o que grep -v grep faz

  • Como salvar um caminho com ~ em uma variável?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve