Passar argumentos de comandos anteriores (pipes) para a função awk / printf e formatar saída

0

Estou tentando filtrar os comandos mais usados e imprimi-los de uma determinada 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 ▄▄▄▄▄▄▄▄▄▄▄

Eu 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 de distância do segundo.

PS: A escala para o pode ser qualquer coisa.

    
por x80486 13.05.2018 / 20:35

3 respostas

1

Seguindo a abordagem do PO, substitua awk por Perl - 'Perl -ae' é muito semelhante ao awk ...

... | perl -ae ' printf "%-20s %d %s\n", $F[0], $F[1],"▄"x$F[1]'
aa                  12 ▄▄▄▄▄▄▄▄▄▄▄▄
bb                  23 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

Editar: com Awk, você pode executar algo nos moldes de

... | awk '{printf "%-20s %d %.*s\n",$1,$2,$2,"▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"}'

printf formatos de função (usados em C, Awk, Perl, printf comando, etc) podem ser um pouco complicados. Seguindo alguns exemplos com strings:

  • "%.20s,str - width = max (20, len (str)), alinhamento = esquerda
  • "%20s",str - width = max (20, len (str)), alinhar = rigth
  • "%.20s",str --width = min (20, len (str)), trunca se len > 20
  • "%20.20s,str - width = 20, trunca se len > 20, alinhamento = direito
  • "%*s",30,str - é printt("%30s",str)
  • "%.*s",30,str - é printt("%.30s",str)
por 14.05.2018 / 00:15
1

Com a ajuda do @JJoao, foi o que surgiu mais tarde:

$ history | tr -s ' ' | cut -d ' ' -f3 | sort | uniq -c | sort -nr | head | awk '{ printf "%-25s %-4d", $2, $1, n = $1 / 5; s = sprintf("%*.s", n, ""); gsub(/ /, "◼", s); print s }'
history                   227 ◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼
./rebar3                  30  ◼◼◼◼◼◼
cat                       26  ◼◼◼◼◼
cd                        24  ◼◼◼◼
docker                    21  ◼◼◼◼
ps                        20  ◼◼◼◼
bin/erlang_cowboy         19  ◼◼◼
sudo                      13  ◼◼
nix-env                   8   ◼
nix-channel               8   ◼

Não é um "grande negócio", mas algo que eu preciso no trabalho ... caso alguém precise dele mais tarde.

    
por 15.05.2018 / 13:06
0

Acho que você está procurando xargs na primeira parte. Por exemplo:

$ echo foo bar| xargs printf "- %s - %s -\n"
- foo - bar -

Para pad e left ajuste a saída do printf você pode fazer algo como:

$ echo foobar 19 | xargs printf '%-30s %s'
foobar                         19

Para garantir que a formatação se adapte ao nome do 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, em seguida, não imprima os resultados até que tenha lido toda a entrada, por exemplo, usando awk .

    
por 13.05.2018 / 21:29