Как узнать, какая моя наиболее часто используемая команда linux?

43

Я хотел бы знать, какую команду я использую больше всего в командной строке. Я хотел бы знать, чтобы я мог улучшить свое использование командной строки. Если я знаю, какую команду я использую чаще всего, тогда я смогу прочитать о них больше, попытаться найти более эффективные способы их использования.

Я знаю, история хранит список всех предыдущих команд, которые я набрал. Как бы я обработал его, чтобы увидеть список из 10 или 20 самых популярных команд.

nelaaro
источник
Да, я просто опубликовал этот вопрос, чтобы ответить на него. Просто так интересно, что я думаю, что сообщество суперпользователей действительно посчитает это интересным.
nelaaro
1
Нет ничего плохого в том, чтобы публиковать ответы на свои вопросы. Это удобная закладка, и если вы на неправильном пути, вы скоро услышите об этом!
Кен

Ответы:

59

Я только что видел этот пост на http://linux.byexamples.com/

В основном вы используете простой однострочный сценарий awk

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  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
источник
3
На моем OSX вывод истории отличается, поэтому мне просто нужно было поменять первые $ 2 на $ 4, и это работает.
Лиам
17
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

Команда awk выведет первую строку из ~ / .bash_history (без отображения параметров или аргументов команды), затем sort отсортирует все строки в алфавитном порядке, затем "uniq -c" удалит дублированные строки (введенные вами команды) и посчитает их, а также последняя сортировка упорядочит ваши команды по количеству, возвращаемому uniq.

бэр
источник
Вы также можете добавить -rв конце команды, чтобы отсортировать их в обратном порядке и | head -10ограничить количество результатов.
ROMANIA_engineer
10

Вы можете использовать hashкоманду в своем терминале, которая хранит запись хеш-функции для каждой команды, которую вы используете, а также количество совпадений и на основе совпадений вы можете их отсортировать и обработать.

Проверьте эту статью для получения дополнительной информации.

Prashere
источник
8

Для более общего ответа включите « учет процессов » в своей системе. Вы можете получить не только частоту использования, но и статистику процессора, памяти и ввода / вывода.

mpez0
источник
6

Сценарии в других ответах учитывают только первую команду, выполненную в каждой командной строке; они не включают команды, выполняемые после каналов (то есть '|'). Например, если эта строка была в вашей истории bash:

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

тогда в возвращаемую сводку наиболее выполняемых команд не будут включены `sort 'и' uniq ', а также второй` sort', поскольку они не были первым токеном в строке.

Основываясь на ответе от nelaar, достаточно сначала разбить строки в истории Bash на каждую трубу:

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
источник
6

Веселым дополнением будет гистограмма:

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

Выход:

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

Длинные команды смещают интервал.

joelostblom
источник
Любая идея о том, как сделать длинные команды, не компенсирующие интервал?
Ашиш Ахаджа
@fortunate_man К сожалению, нет, но я не очень знаком с Perl, так что вы можете получить ответ, если зададите его в качестве нового вопроса. Я попытался найти способ печати с фиксированной шириной, но сразу не нашел ничего полезного, и документация по функциям также не сильно помогла. Возможно, вам придется использовать printfили sprintfвместо print.
Joelostblom
2

Используйте, $ 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чтобы получить список ваших лучших 10 команд.

Пример:

 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
Неделчо Христов
источник
Чем это отличается от принятого ответа?
Ашиш Ахаджа
1

Вы можете awkсмоделировать вышеуказанный ответ от @nelaar в хороший сценарий 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
источник
1

Ну, это модифицированная версия команды "Неделчо Христов", скопированная и вставленная здесь .... если вы сохранили или отметили дату в своей истории bash, то у вас будет ошибочный вывод

Это поможет вам лучше использовать это:

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
источник