Wie sehe ich, was mein meistgenutzter Linux-Befehl ist?

43

Ich möchte wissen, welchen Befehl ich in der Befehlszeile am häufigsten verwende. Ich würde gerne wissen, dass ich die Verwendung der Befehlszeile verbessern kann. Wenn ich weiß, welchen Befehl ich am häufigsten verwende, kann ich mehr über sie lesen und versuchen, bessere Wege zu finden, um sie zu verwenden.

Ich weiß, dass der Verlauf eine Liste aller zuvor von mir eingegebenen Befehle enthält. Wie würde ich es verarbeiten, um eine Liste der Top 10 oder 20 am häufigsten verwendeten Befehle zu sehen.

Nelaaro
quelle
Ja, ich habe gerade diese Frage gestellt, um sie zu beantworten. Es ist einfach so interessant, dass ich dachte, die Superuser-Community würde es wirklich interessant finden.
Nelaaro
1
Es ist überhaupt nichts Falsches daran, Fragen zu stellen, um sich selbst zu beantworten. Es macht ein handliches Lesezeichen, und wenn Sie auf dem falschen Weg sind, werden Sie bald davon hören!
Ken

Antworten:

59

Ich habe diesen Beitrag gerade auf http://linux.byexamples.com/ gesehen.

Grundsätzlich verwenden Sie ein einfaches einzeiliges awk-Skript

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

Eine vollständige Erklärung finden Sie unter dem Link oben.

Ein Beispiel für die Ausgabe auf meinem Computer ist:

 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
quelle
3
Auf meinem OSX ist die Ausgabe von history anders, also musste ich nur die ersten $ 2 in $ 4 ändern und das funktioniert.
Liam
17
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

Der Befehl awk gibt den ersten String aus ~ / .bash_history aus (ohne Befehlsoptionen oder Argumente), sortiert alle Zeilen alphabetisch, und "uniq -c" entfernt doppelte Zeilen (Ihre eingegebenen Befehle) und zählt sie und Bei der letzten Sortierung werden Ihre Befehle nach der von uniq zurückgegebenen Zählnummer sortiert.

rems
quelle
Sie können auch -ram Ende des Befehls hinzufügen , um sie in umgekehrter Reihenfolge zu sortieren und | head -10die Anzahl der Ergebnisse zu begrenzen.
ROMANIA_engineer
10

Sie können den hashBefehl in Ihrem Terminal verwenden, der einen Hash-Eintrag für jeden von Ihnen verwendeten Befehl zusammen mit der Anzahl der Treffer enthält und auf der Grundlage der Treffer, die Sie sortieren und verarbeiten können.

In diesem Artikel finden Sie weitere Informationen.

Prashere
quelle
8

Um eine allgemeinere Antwort zu erhalten, aktivieren Sie " Prozessabrechnung " auf Ihrem System. Sie können nicht nur die Nutzungshäufigkeit, sondern auch die CPU-, Speicher- und E / A-Gesamtstatistik abrufen.

mpez0
quelle
6

Die Skripte in den anderen Antworten zählen nur den ersten Befehl, der in jeder Befehlszeile ausgeführt wird. Sie enthalten keine Befehle, die nach Pipes ausgeführt werden (z. B. '|'). Wenn sich diese Zeile beispielsweise in Ihrem Bash-Verlauf befindet:

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

In der zurückgegebenen Zusammenfassung der am häufigsten ausgeführten Befehle würden dann "sort" und "uniq" und die zweite "sort" nicht enthalten sein, da sie nicht die ersten Token in der Zeile waren.

Aufbauend auf der Antwort von nelaar genügt es, zuerst die Zeilen in Ihrem Bash-Verlauf auf jeder Pipe aufzuteilen:

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
quelle
6

Eine lustige Ergänzung wäre ein Balkendiagramm der Zählungen:

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

Ausgabe:

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

Lange Befehle gleichen den Abstand aus.

joelostblom
quelle
Irgendeine Idee, wie lange Befehle den Abstand nicht ausgleichen können?
Ashish Ahuja
@fortunate_man Leider nicht, aber ich bin nicht sehr vertraut mit Perl, daher erhalten Sie möglicherweise eine Antwort, wenn Sie dies als neue Frage stellen. Ich habe versucht zu suchen, wie man eine feste Breite druckt, fand aber nicht sofort etwas hilfreiches, und die Funktionsdokumentation war auch nicht sehr hilfreich. Möglicherweise müssen Sie printfoder sprintfanstelle von verwenden print.
Joelostblom
2

Verwenden Sie $ 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, um eine Liste der 10 häufigsten Befehle abzurufen.

Beispiel:

 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
Неделчо Христов
quelle
Wie unterscheidet sich das von der akzeptierten Antwort?
Ashish Ahuja
1

Sie können die obige awkAntwort von @nelaar in ein nettes Bash-Skript umwandeln:

#!/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
quelle
1

Nun, dies ist eine modifizierte Version des Befehls "Неделчо Христов", der hier kopiert und eingefügt wurde. Wenn Sie Ihren Bash-Verlauf gesichert oder mit einem Datum versehen haben, wird eine fehlerhafte Ausgabe ausgegeben

Damit können Sie Folgendes besser nutzen:

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
quelle