41

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

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

9 ответов9

52

Я только что видел этот пост на 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
17
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

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

10

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

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

8

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

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 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

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

5

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

Ну, это модифицированная версия команды "Неделчо Христов", скопированная и вставленная сюда .... если вы сохранили или отметили дату в своей истории 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
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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .