Como vejo o meu comando linux mais usado?


43

Gostaria de saber qual comando eu mais uso na linha de comando. Gostaria de saber para melhorar meu uso da linha de comando. Se eu souber qual comando eu mais uso, posso ler mais sobre eles e tentar descobrir maneiras melhores de usá-los.

Eu sei que a história mantém uma lista de todos os comandos anteriores que eu digitei. Como eu processaria para ver uma lista dos 10 ou 20 principais comandos mais usados.


Sim, acabei de postar esta pergunta para respondê-la. É tão interessante que eu achei que a comunidade de superusuários seria realmente interessante.
nelaaro

1
Nada de errado em postar perguntas para responder a si mesmo. Ele é um marcador útil e, se você estiver no caminho errado, ouvirá em breve!
Ken

Respostas:


59

Acabei de ver este post em http://linux.byexamples.com/

Basicamente, você usa um script awk simples de uma linha

history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10

Uma explicação completa pode ser encontrada no link acima.

Exemplo de colocar na minha máquina é:

 1  211  21.1%  ls
 2  189  18.9%  sudo
 3  58   5.8%   man
 4  52   5.2%   cd
 5  43   4.3%   ping
 6  40   4%     apropos
 7  34   3.4%   less
 8  22   2.2%   cat
 9  18   1.8%   which
10  18   1.8%   aspell

3
No meu OSX, a saída do histórico é diferente, então eu só precisava mudar os primeiros US $ 2 para US $ 4 e isso funciona.
Liam

17
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

O comando awk imprimirá a primeira string de ~ / .bash_history (não mostrando opções ou argumentos de comando); a classificação ordenará todas as linhas em ordem alfabética; "uniq -c" removerá as linhas duplicadas (seus comandos digitados) e as contará e a última classificação ordenará seus comandos pelo número de contagem retornado pela uniq.


Você também pode adicionar -rno final do comando para classificá-los na ordem inversa e | head -10para limitar o número de resultados.
ROMANIA_engineer

10

Você pode usar o hashcomando no seu terminal, que mantém uma entrada de hash de todos os comandos que você usa, juntamente com o número de ocorrências e, com base nas ocorrências, você pode classificá-las e processá-las.

Consulte este artigo para obter mais informações.


8

Para uma resposta mais geral, ative a " contabilidade do processo " no seu sistema. Você pode obter não apenas a frequência de uso, mas agregar estatísticas de CPU, memória e E / S.


6

Os scripts nas outras respostas contam apenas o primeiro comando executado em cada linha de comando; eles não incluem comandos executados após pipes (ou seja, '|'). Por exemplo, se essa linha estiver no seu histórico do bash:

awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

então, no resumo retornado dos comandos mais executados, 'sort' e 'uniq' e o segundo 'sort' não seriam incluídos, pois não eram o primeiro token na linha.

Com base na resposta da nelaar, basta dividir primeiro as linhas do seu histórico do bash em cada canal:

sed 's/|/\n/g' ~/.bash_history | awk '{CMD[$1]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10

6

Uma adição divertida seria um gráfico de barras das contagens:

history | tr -s ' ' | cut -d ' ' -f3 | sort | uniq -c | sort -n | tail | perl -lane 'print $F[1], "\t", $F[0], " ", "▄" x ($F[0] / 12)'

Saída:

man     226 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
cat     230 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
rm      235 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
ls      240 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
aura    273 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
mv      362 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sudo    534 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
vi      611 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
git     693 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
cd      754 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

Comandos longos compensarão o espaçamento.


Alguma idéia de como fazer comandos longos não compensar o espaçamento?
Ashish Ahuja

@fortunate_man Infelizmente não, mas eu não estou muito familiarizado com o perl, então você poderá obter uma resposta se fizer isso como uma nova pergunta. Tentei pesquisar como imprimir largura fixa, mas não encontrei nada imediatamente útil, e a documentação da função também não ajudou muito. Você pode precisar usar printfou em sprintfvez de print.
Joelostblom 7/10

2

Use $ history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10para obter uma lista dos seus 10 principais comandos.

Exemplo:

 1  272  27.2%  svn
 2  227  22.7%  cd
 3  159  15.9%  sudo
 4  57   5.7%   ll
 5  52   5.2%   mc
 6  32   3.2%   rm
 7  23   2.3%   mkdir
 8  19   1.9%   exit
 9  13   1.3%   subl
10  13   1.3%   find

Como isso é diferente da resposta aceita?
Ashish Ahuja

1

Você pode awktransformar a resposta acima de @nelaar em um bom script de bash:

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10

1

Bem, esta é uma versão modificada do comando "Неделчо Христов" copiada e colada aqui ...

Isso o ajudará a usar melhor:

awk '{CMD[$1]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' .bash_history | grep -v "#" | sort -nr | nl | column -c3 -s " " -t | head -n 20
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.