Jak mogę zobaczyć, jakie są moje najczęściej używane polecenia linux?

43

Chciałbym wiedzieć, którego polecenia najczęściej używam w wierszu poleceń. Chciałbym wiedzieć, żebym mógł lepiej korzystać z wiersza poleceń. Jeśli wiem, którego polecenia najczęściej używam, mogę przeczytać więcej na jego temat i znaleźć lepsze sposoby ich użycia.

Wiem, że historia przechowuje listę wszystkich poprzednich poleceń, które wpisałem. Jak miałbym to przetworzyć, aby wyświetlić listę 10 lub 20 najczęściej używanych poleceń.

nelaaro
źródło
Tak, właśnie opublikowałem to pytanie, aby na nie odpowiedzieć. To jest tak interesujące, że myślałem, że społeczność superużytkowników naprawdę by go zainteresowała.
nelaaro
1
W ogóle nie ma nic złego w zadawaniu pytań, aby odpowiedzieć sobie. Jest to przydatna zakładka, a jeśli jesteś na niewłaściwym torze, wkrótce o tym usłyszysz!
Ken

Odpowiedzi:

59

Właśnie widziałem ten post na http://linux.byexamples.com/

Zasadniczo używasz prostego skryptu awk o jednym wierszu

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

Pełne wyjaśnienie można znaleźć pod linkiem powyżej.

Przykład wyjścia umieszczonego na moim komputerze to:

 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
źródło
3
W moim OSX dane wyjściowe historii są inne, więc po prostu musiałem zmienić pierwsze 2 USD na 4 USD i to działa.
Liam,
17
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

Polecenie awk wyświetli pierwszy ciąg z ~ / .bash_history (nie pokazuje opcji poleceń ani argumentów), następnie sort sortuje wszystkie wiersze alfabetycznie, następnie „uniq -c” usunie zduplikowane wiersze (twoje wpisane polecenia) i policzy je, i ostatni sort posortuje twoje polecenia według liczby zliczeń zwróconej przez uniq.

rems
źródło
Możesz także dodać -rna końcu polecenia, aby posortować je w odwrotnej kolejności i | head -10ograniczyć liczbę wyników.
ROMANIA_inżynier
10

Możesz użyć hashpolecenia w swoim terminalu, który przechowuje hash każdego polecenia, którego używasz wraz z liczbą trafień i na podstawie trafień możesz je uporządkować i przetworzyć.

Sprawdź ten artykuł, aby uzyskać więcej informacji.

Prashere
źródło
8

Aby uzyskać bardziej ogólną odpowiedź, włącz „ rozliczanie procesów ” w systemie. Możesz uzyskać nie tylko częstotliwość użycia, ale także zagregować statystyki procesora, pamięci i operacji we / wy.

mpez0
źródło
6

Skrypty w pozostałych odpowiedziach liczą tylko pierwsze polecenie wykonane w każdym wierszu poleceń; nie obejmują poleceń wykonywanych po potokach (tj. „|”). Na przykład, jeśli sama linia była w twojej historii bash:

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

następnie w zwróconym zestawieniu najczęściej wykonywanych poleceń „sort” i „uniq” oraz drugie „sort” nie byłyby uwzględnione, ponieważ nie były pierwszym tokenem w linii.

Opierając się na odpowiedzi od nelaar, wystarczy najpierw podzielić linie w historii bash na każdej rurze:

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
źródło
6

Zabawnym dodatkiem byłby wykres słupkowy zliczeń:

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

Wynik:

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

Długie polecenia wyrównają odstępy.

joelostblom
źródło
Masz pomysł, jak wykonać długie polecenia, które nie będą równoważyć odstępów?
Ashish Ahuja
@fortunate_man Niestety nie, ale nie znam się zbyt dobrze na perlu, więc możesz bardzo dobrze uzyskać odpowiedź, jeśli zadasz nowe pytanie. Próbowałem poszukać sposobu drukowania stałej szerokości, ale nie znalazłem niczego, co byłoby natychmiast pomocne, a dokumentacja funkcji również nie była zbyt pomocna. Może być konieczne użycie printflub sprintfzamiast print.
joelostblom
2

Użyj, $ 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 -n10aby uzyskać listę 10 najlepszych poleceń.

Przykład:

 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
Неделчо Христов
źródło
Czym różni się to od przyjętej odpowiedzi?
Ashish Ahuja
1

Możesz awkprzekształcić powyższą odpowiedź z @nelaar w ładny skrypt 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
źródło
1

Cóż, to jest zmodyfikowana wersja polecenia „Неделчо Христов” skopiowana i wklejona tutaj ... jeśli zabezpieczyłeś lub opatrzyłeś datą swoją historię bashów, będziesz miał błędne wyjście

Zrobisz to lepiej, używając tego:

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
źródło