Comment voir quelle est ma commande linux la plus utilisée?

43

Je voudrais savoir quelle commande j'utilise le plus sur la ligne de commande. Je voudrais savoir afin que je puisse améliorer mon utilisation de la ligne de commande. Si je connais la commande que j'utilise le plus, je peux en lire plus à leur sujet et essayer de trouver de meilleurs moyens de les utiliser.

Je sais que l'historique conserve une liste de toutes les commandes précédentes que j'ai tapées. Comment pourrais-je le traiter pour voir une liste des 10 ou 20 commandes les plus utilisées?

Nelaaro
la source
Oui, je viens de poster cette question pour y répondre. C'est tellement intéressant que je pensais que la communauté des super-utilisateurs le trouverait vraiment intéressant.
Nelaaro
1
Rien de mal à poster des questions pour répondre à vous-même. C'est un marque-page pratique, et si vous êtes sur la mauvaise piste, vous en entendrez bientôt parler!
Ken

Réponses:

59

Je viens de voir ce post sur http://linux.byexamples.com/

Fondamentalement, vous utilisez un simple script awk d'une ligne

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

Une explication complète peut être trouvée sur le lien ci-dessus.

Exemple de mise hors tension sur ma machine:

 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
la source
3
Sur mon OSX, la sortie de l’historique est différente, il me fallait donc changer le premier $ 2 en $ 4 et cela fonctionne.
Liam
17
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

La commande awk imprimera la première chaîne de ~ / .bash_history (sans afficher les options ni les arguments de la commande), puis sort ordonnera toutes les lignes par ordre alphabétique, puis "uniq -c" supprimera les lignes dupliquées (vos commandes saisies) et les comptera, puis le dernier tri ordonnera vos commandes en fonction du nombre compté renvoyé par uniq.

rems
la source
Vous pouvez également ajouter -rà la fin de la commande pour les trier dans l'ordre inverse et | head -10limiter le nombre de résultats.
ROMANIA_engineer
10

Vous pouvez utiliser la hashcommande de votre terminal, qui conserve une entrée de hachage pour chaque commande que vous utilisez, ainsi que le nombre de hits et en fonction des hits, que vous pouvez trier et traiter.

Consultez cet article pour plus d'informations.

Prashere
la source
8

Pour une réponse plus générale, activez " comptabiliser les processus " sur votre système. Vous pouvez obtenir non seulement la fréquence d'utilisation, mais aussi des statistiques agrégées sur le processeur, la mémoire et les E / S.

mpez0
la source
6

Les scripts des autres réponses ne comptent que la première commande exécutée dans chaque ligne de commande; ils n'incluent pas les commandes exécutées après les tubes (c'est-à-dire '|'). Par exemple, si cette ligne elle-même était dans votre historique bash:

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

puis, dans le résumé renvoyé des commandes les plus exécutées, "sort" et "uniq" et le deuxième "sort" ne seraient pas inclus, car ils n'étaient pas le premier jeton de la ligne.

En vous basant sur la réponse de nelaar, il suffit de scinder d’abord les lignes de votre historique bash sur chaque pipe:

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
la source
6

Un ajout amusant serait un diagramme à barres des comptes:

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

Sortie:

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

Les commandes longues compenseront l'espacement.

joelostblom
la source
Toute idée sur la façon de faire de longues commandes ne compense pas l'espacement?
Ashish Ahuja
@fortunate_man Malheureusement non, mais je ne connais pas très bien perl, vous pourriez donc très bien obtenir une réponse si vous posez cette question sous forme de nouvelle question. J'ai essayé de chercher comment imprimer une largeur fixe, mais je n'ai rien trouvé d'aide immédiatement, et la documentation de la fonction n'était pas très utile non plus. Vous devrez peut-être utiliser printfou sprintfau lieu de print.
joelostblom
2

Utilisez $ 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 -n10pour obtenir une liste de vos 10 commandes les plus courantes.

Exemple:

 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
Неделчо Христов
la source
En quoi est-ce différent de la réponse acceptée?
Ashish Ahuja
1

Vous pouvez awktransformer la réponse ci-dessus de @nelaar en un joli script 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
la source
1

Il s’agit bien d’une version modifiée de la commande "Неделчо Христов" copiée et collée ici .... si vous avez sécurisé ou daté votre historique de bash, vous obtiendrez une sortie erronée.

Cela vous fera mieux d'utiliser ceci:

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
la source