Làm thế nào để tôi thấy lệnh linux được sử dụng nhiều nhất của tôi là gì?


43

Tôi muốn biết lệnh nào tôi sử dụng nhiều nhất trên dòng lệnh. Tôi muốn biết để tôi có thể cải thiện việc sử dụng dòng lệnh. Nếu tôi biết tôi sử dụng lệnh nào nhiều nhất, thì tôi có thể đọc thêm về chúng thử và tìm ra những cách tốt hơn để sử dụng chúng.

Tôi biết lịch sử giữ một danh sách tất cả các lệnh trước đây tôi đã gõ. Làm thế nào tôi có thể xử lý nó để xem danh sách 10 hoặc 20 lệnh được sử dụng nhiều nhất.


Có tôi đã chỉ đăng câu hỏi này để trả lời nó. Nó thú vị đến nỗi tôi mặc dù cộng đồng siêu người dùng sẽ thực sự thấy nó thú vị.
nelaaro

1
Không có gì sai với việc đăng câu hỏi để trả lời chính mình. Nó tạo ra một dấu trang tiện dụng và nếu bạn đang đi sai đường, bạn sẽ sớm nghe về nó!
Ken

Câu trả lời:


59

Tôi chỉ thấy bài đăng này trên http://linux.byexamples.com/

Về cơ bản, bạn sử dụng một kịch bản awk một dòng đơn giản

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

Một lời giải thích đầy đủ có thể được tìm thấy tại liên kết ở trên.

Ví dụ về đưa ra trên máy của tôi là:

 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
Trên OSX của tôi, đầu ra của lịch sử là khác nhau, vì vậy tôi chỉ cần thay đổi $ 2 đầu tiên thành $ 4 và điều này hoạt động.
Liam

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

Lệnh awk sẽ in chuỗi đầu tiên từ ~ / .bash_history (không hiển thị tùy chọn lệnh hoặc đối số), sau đó sắp xếp sẽ sắp xếp tất cả các dòng theo thứ tự bảng chữ cái, sau đó "uniq -c" sẽ xóa các dòng trùng lặp (các lệnh đã nhập của bạn) và đếm chúng, và đếm chúng, và đếm chúng, và đếm chúng, và đếm chúng, và đếm chúng, và sắp xếp cuối cùng sẽ sắp xếp các lệnh của bạn theo số đếm được trả về bởi uniq.


Bạn cũng có thể thêm -rvào cuối lệnh để sắp xếp chúng theo thứ tự đảo ngược và | head -10để giới hạn số lượng kết quả.
ROMANIA_engineer

10

Bạn có thể sử dụng hashlệnh trong thiết bị đầu cuối của mình, nó giữ một mục băm của mỗi lệnh bạn sử dụng cùng với số lần truy cập và dựa trên số lần truy cập mà bạn có thể sắp xếp chúng và xử lý.

Kiểm tra bài viết này để biết thêm thông tin.


8

Để có câu trả lời tổng quát hơn, hãy bật " quy trình kế toán " trên hệ thống của bạn. Bạn có thể nhận được không chỉ tần suất sử dụng, mà còn tổng hợp các chỉ số CPU, bộ nhớ và I / O.


6

Các tập lệnh trong các câu trả lời khác chỉ tính lệnh đầu tiên được thực hiện trong mỗi dòng lệnh; chúng không bao gồm các lệnh được thực thi sau các đường ống (tức là '|'). Ví dụ: nếu chính dòng này nằm trong lịch sử bash của bạn:

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

sau đó trong bản tóm tắt được trả về của các lệnh được thực thi nhiều nhất, 'sort' và 'uniq' và 'sort' thứ hai sẽ không được đưa vào, vì chúng không phải là mã thông báo đầu tiên trong dòng.

Dựa trên câu trả lời từ nelaar, điều đầu tiên là đủ để phân chia các dòng trong lịch sử bash của bạn trên mỗi đường ống:

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

Một bổ sung thú vị sẽ là một biểu đồ thanh của các số đếm:

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

Đầu ra:

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

Các lệnh dài sẽ bù khoảng cách.


Bất kỳ ý tưởng về cách làm cho các lệnh dài không bù khoảng cách?
Ashish Ahuja

@fortucky_man Thật không may, nhưng tôi không rành lắm về perl, vì vậy bạn rất có thể nhận được câu trả lời nếu bạn hỏi đó như một câu hỏi mới. Tôi đã thử tìm kiếm cách in chiều rộng cố định, nhưng không tìm thấy gì hữu ích ngay lập tức và tài liệu chức năng cũng không giúp được gì nhiều. Bạn có thể cần phải sử dụng printfhoặc sprintfthay vì print.
joelostblom

2

Sử dụng $ 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để có được danh sách 10 lệnh hàng đầu của bạn.

Thí dụ:

 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

Điều này khác với câu trả lời được chấp nhận như thế nào?
Ashish Ahuja

1

Bạn có thể biến awkcâu trả lời trên từ @nelaar thành một tập lệnh bash hay:

#!/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

Chà, đây là phiên bản sửa đổi của lệnh "еееееее е е е е

Điều này sẽ giúp bạn tốt hơn bằng cách sử dụng này:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.