Estou tentando filtrar os comandos mais usados e imprimi-los de uma certa maneira. Até agora, consegui colocar os "filtros" desejados:
$ history | tr -s ' ' | cut -d ' ' -f3 | sort | uniq -c | sort -n | tail | awk '{ printf "%s%20s\n", $2, $1 }'
...mas não consigo obter a saída corretamente.
Eu gostaria de poder exibir a saída final como:
checkupdates 16 ▄▄▄
find 16 ▄▄▄
./gradlew 17 ▄▄▄
./rebar3 21 ▄▄▄▄
nix-env 24 ▄▄▄▄
cd 26 ▄▄▄▄▄
docker 33 ▄▄▄▄▄▄
rebar3 43 ▄▄▄▄▄▄▄▄
sudo 46 ▄▄▄▄▄▄▄▄▄
flatpak 56 ▄▄▄▄▄▄▄▄▄▄▄
Quero usar awk
ou printf
, mas não consigo descobrir como formatar a saída. Além disso, é complicado gerenciar o espaço entre o(s) comando(s) e a próxima coluna (os números de uso) ‒ o terceiro está a apenas um espaço do segundo.
PS: A escala para o ▄ pode ser qualquer coisa.
Eu acho que você está procurando pela
xargs
primeira parte. Por exemplo:Para preencher e ajustar à esquerda a saída de printf, você pode fazer algo como:
Para garantir que a formatação se adapte ao nome de comando mais longo e para criar a barra, você provavelmente terá que escrever algo mais complicado que verifique o comprimento do argumento mais longo na primeira coluna e não imprima os resultados até ele leu toda a entrada, por exemplo, usando
awk
.Seguindo a abordagem de PO, substitua awk por Perl -- 'Perl -ae' é muito semelhante a awk...
Editar: com Awk, você pode executar algo nas linhas de
printf
formatos de função (usados em C, Awk, Perl,printf
comando, etc) podem ser um pouco complicados. Segue alguns exemplos com strings:"%.20s,str
- largura=max(20,len(str)), alinhar=esquerda"%20s",str
- largura=máx(20,len(str)), alinhar=direita"%.20s",str
- largura=min(20,len(str)), trunca se len>20"%20.20s,str
- width=20 , trunca se len>20, align=right"%*s",30,str
- éprintt("%30s",str)
"%.*s",30,str
- éprintt("%.30s",str)
Com a ajuda de @JJoao, isso é o que eu criei mais tarde:
Não é um "grande negócio", mas algo que eu preciso no trabalho... caso alguém precise mais tarde.