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.

nelaaro
fonte
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
nelaaro
fonte
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.

rems
fonte
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.

Prashere
fonte
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.

mpez0
fonte
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
Shaneb
fonte
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.

joelostblom
fonte
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
Неделчо Христов
fonte
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
nettux
fonte
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
Th3_4n3r
fonte