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-192
como bc 1+1
echoesFile 1+1 is unavailable.
exp
expr 236 - 192
onde eu preciso digitar espaços antes e depois do operador como expr 1+1
apenas ecos 1+1
.
Você pode reduzir a quantidade de verbosidade envolvida no uso de
bc
:(assumindo que seu shell suporta isso).
Se você preferir ter isso como uma função:
(
-l
habilita a biblioteca matemática padrão e aumenta a escala padrão para 20.)Armazene a
c
definição em seu arquivo de inicialização de shell favorito se desejar disponibilizá-la sempre.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)
E use como:
Casca
O calc mais simples no CLI é o próprio CLI (shell) (If
IFS
é o padrão):Os espaços podem ser omitidos:
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):
E alguns shells têm a maior parte da sintaxe matemática da linguagem C (incluindo vírgula):
Mas é apenas matemática inteira (e geralmente menos de 2 63 nos sistemas operacionais atuais) em alguns shells:
Alguns shells podem fazer matemática flutuante:
Evite o zsh (o zcalc tem problemas semelhantes):
Eu recomendo que você evite
expr
, ele precisa de escapes estranhos às vezes:bc
No próximo nível está ( também POSIX )
bc
(primo de RPNdc
)O
dc
foi (historicamente) usado para implementar o bc e foi excluído do POSIX em 2017 .Mais curto se o seu shell suportar:
Ou ainda:
Ambas são calculadoras de precisão arbitrária com algumas funções matemáticas internas:
awk
Depois dessas ferramentas de cálculo realmente básicas , você precisa ir para outros idiomas
função
Você pode definir uma função de qualquer uma das opções acima:
E use:
Lendo os comentários desta página , vejo um programa UNIX/Linux chamado
calc
que faz exatamente o que você deseja. Se no Debian / Ubuntu / derivados:ou no Fedora Linux:
então você pode:
e se você adicionar um alias
alias c='calc'
ao seu.bashrc
ou/etc/bash.bashrc
então ele se torna:na linha de comando.
Em
zsh
:Pessoalmente, gosto de libqalculate (a versão de linha de comando do Qalculate ).
Embora a interface seja certamente simples, (lib)qalculate é uma calculadora poderosa e completa. por exemplo
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.
Para sair, basta pressionar Ctrl+ d.
Para um acesso ainda mais rápido, defina-o para algo como
alias ca='qalc'
.O
units
programa, embora não tenha a intenção de ser usado como uma calculadora, na verdade funciona muito bem como uma.Se houver espaços na expressão, a expressão deverá ser protegida por aspas.
Ele suporta exponenciais e aninhamento profundo de colchetes
O que eu faço no zsh é:
No bash, eu teria que mencionar explicitamente cat:
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
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 abc
solução (que pode ser, por exemplo,`echo ...|bc`
).Com relação à verbosidade, o
bc
comando permite a opção-q
que suprime a saída do "normal GNUbc
welcome" .Como uma observação final, ligeiramente limítrofe, vamos notar que
bc
nã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)awk
vez debc
.Fontes: https://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html
Python aberto em outra guia?
Já tentou concalc ?
Instale com: