가장 많이 사용되는 Linux 명령이 무엇인지 어떻게 알 수 있습니까?


43

명령 줄에서 가장 많이 사용하는 명령을 알고 싶습니다. 커맨드 라인 사용을 향상시킬 수 있도록 알고 싶습니다. 내가 어떤 명령을 가장 많이 사용하는지 알고 있다면, 더 많은 명령을 읽고 사용하는 더 좋은 방법을 찾아 낼 수 있습니다.

나는 역사에 내가 입력 한 모든 이전 명령의 목록을 유지한다는 것을 알고있다. 가장 많이 사용되는 10 또는 20 개의 명령 목록을 보려면 어떻게 처리해야합니까?


예,이 질문에 답하기 위해 게시했습니다. 슈퍼 유저 커뮤니티가 정말 흥미로울 것 같지만 정말 흥미 롭습니다.
nelaaro

1
자신에게 답하기 위해 질문을 게시해도 전혀 문제가 없습니다. 편리한 북마크를 만들고 잘못된 트랙에 있으면 곧 알게 될 것입니다!
Ken

답변:


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

3
내 OSX에서 히스토리 출력이 다르므로 첫 $ 2를 $ 4로 변경하면됩니다.
Liam

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터미널 에서 명령을 사용할 수 있습니다. 그러면 사용하는 모든 명령의 해시 항목이 적중 수와 함께 정렬되어 처리 할 수있는 적중을 기반으로 유지됩니다.

자세한 내용은 이 기사 를 확인 하십시오.


8

보다 일반적인 답변을 얻으 려면 시스템에서 " 프로세스 계정 "을 활성화 하십시오. 사용 빈도뿐만 아니라 CPU, 메모리 및 I / O 통계를 집계 할 수 있습니다.


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

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

긴 명령은 간격을 상쇄합니다.


간격을 상쇄하지 않는 긴 명령을 만드는 방법에 대한 아이디어가 있습니까?
Ashish Ahuja

@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

이것이 허용되는 답변과 어떻게 다릅니 까?
Ashish Ahuja

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

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.