Come posso vedere quali sono i miei comandi linux più utilizzati?


43

Vorrei sapere quale comando utilizzo di più nella riga di comando. Vorrei sapere in modo da poter migliorare il mio uso della riga di comando. Se so quale comando utilizzo di più, posso quindi leggere di più su di loro e provare a trovare modi migliori per usarli.

So che la storia tiene un elenco di tutti i comandi precedenti che ho digitato. Come lo elaborerei per visualizzare un elenco dei primi 10 o 20 comandi più utilizzati.


Sì, ho appena pubblicato questa domanda per rispondere. È così interessante che ho pensato che la comunità dei superutente la trovasse davvero interessante.
nelaaro,

1
Nulla di sbagliato nel pubblicare domande per rispondere a te stesso. È un comodo segnalibro e se sei sulla strada sbagliata ne sentirai presto parlare!
Ken,

Risposte:


59

Ho appena visto questo post su http://linux.byexamples.com/

Fondamentalmente usi un semplice script awk a una riga

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

Una spiegazione completa è disponibile al link sopra.

Un esempio di out put on my 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

3
Sul mio OSX, l'output della cronologia è diverso, quindi avevo solo bisogno di cambiare i primi $ 2 a $ 4 e questo funziona.
Liam,

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

Il comando awk stamperà la prima stringa da ~ / .bash_history (non mostra opzioni o argomenti di comando), quindi ordina ordinerà tutte le righe in ordine alfabetico, quindi "uniq -c" rimuoverà le linee duplicate (i tuoi comandi digitati) e le conterà, e l'ultimo ordinamento ordinerà i tuoi comandi in base al numero di conteggio restituito da uniq.


È inoltre possibile aggiungere -ralla fine del comando per ordinarli in ordine inverso e | head -10per limitare il numero di risultati.
ROMANIA_engineer,

10

Puoi usare il hashcomando nel tuo terminale, che mantiene una voce hash di ogni comando che usi insieme al numero di hit e in base agli hit che puoi ordinarli ed elaborare.

Consulta questo articolo per ulteriori informazioni.


8

Per una risposta più generale, abilitare la " contabilità di processo " sul proprio sistema. È possibile ottenere non solo la frequenza d'uso, ma aggregare statistiche CPU, memoria e I / O.


6

Gli script nelle altre risposte contano solo il primo comando eseguito in ciascuna riga di comando; non includono i comandi eseguiti dopo le pipe (cioè '|'). Ad esempio, se questa riga stessa era nella tua cronologia bash:

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

quindi nel riepilogo restituito dei comandi più eseguiti, 'sort' e 'uniq' e il secondo 'sort' non verrebbero inclusi, in quanto non erano il primo token nella riga.

Basandosi sulla risposta di nelaar, è sufficiente prima dividere le linee nella tua storia bash su ogni 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

6

Un'aggiunta divertente sarebbe un grafico a barre dei conteggi:

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

Produzione:

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

I comandi lunghi compensano la spaziatura.


Qualche idea su come eseguire comandi lunghi senza compensare la spaziatura?
Ashish Ahuja,

@fortunate_man Sfortunatamente no, ma non ho molta familiarità con il perl, quindi potresti benissimo ottenere una risposta se la poni come nuova domanda. Ho provato a cercare come stampare a larghezza fissa, ma non ho trovato nulla di immediatamente utile e la documentazione della funzione non è stata di grande aiuto. Potrebbe essere necessario utilizzare printfo sprintfanziché print.
Joelostblom,

2

Utilizzare $ 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 -n10per ottenere un elenco dei primi 10 comandi.

Esempio:

 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

In che modo si differenzia dalla risposta accettata?
Ashish Ahuja,

1

Puoi awktrasformare la risposta di cui sopra da @nelaar in un bel 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

1

Bene, questa è una versione modificata del comando "Неделчо Христов" copiata e incollata qui .... se hai protetto o timbrato la tua cronologia bash allora avrai un output difettoso

Questo ti farà meglio usando questo:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.