ฉันจะสร้างรายการด้วยคำสั่งที่ใช้มากที่สุดในเทอร์มินัลได้อย่างไร


13

ฉันจะสร้างรายการด้วยคำสั่งที่ใช้มากที่สุดในเทอร์มินัลได้อย่างไร

ฉันรู้ว่าคำถามนี้อาจไม่เหมาะสมสำหรับข้อเสนอในอนาคตสำหรับพวกเราบางคน แต่แม้จะเป็นเช่นนี้รายการจะมีประโยชน์เมื่อเราจำคำสั่งที่ใช้ครั้งเดียวหรือบางครั้งในอดีตเมื่อเราสามารถค้นหา ในตอนท้ายของรายการนี้


ขั้วไหน
Elijah Lynn

คำตอบ:


20

เราจะใช้บันทึกจาก.bash_historyไฟล์เพื่อทำสิ่งนี้ คำสั่งถัดไปจะให้รายการคำสั่งทั้งหมดแก่คุณเพื่อให้คุณใช้บ่อยที่สุด:

history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr

หากคุณต้องการเพียง 10 อันดับแรกคุณต้องเพิ่มheadที่คำสั่งด้านบน:

history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head

ในการรับข้อมูลเฉพาะด้านบนตัวอย่างเช่น 5 อันดับแรกให้ใช้headกับ-n 5ตัวเลือก:

คำสั่ง 5 อันดับแรก

หากคุณต้องการรายการในลำดับย้อนกลับ (บนสุดที่มีคำสั่งที่ไม่ค่อยได้ใช้) อย่าใช้roprion เป็นครั้งที่สองsort:

history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -n

และสุดท้ายเพื่อรับรายการด้วยคำสั่งที่ใช้เพียงครั้งเดียวเช่นใช้grep ' 1 '(เปลี่ยน1ด้วยหมายเลขที่ต้องการ):

history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | grep ' 1 '

หากต้องการจัดการกับsudoคำสั่ง (เช่นsudo vim foo) แทนที่จะ{print $3}ใช้คำสั่ง awk เพียงใช้:

{if($3 ~ /sudo/) print $4; else print $3}

ดังนั้นคำสั่งทั้งหมดจะมีลักษณะดังนี้:

history | awk 'BEGIN {FS="[ \t]+|\\|"} {if($3 ~ /sudo/) print $4; else print $3}' | sort | uniq -c | sort -nr

ตัวอย่างเช่น:

$ history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
    284 vim
    260 git
    187 find
    174 man
    168 echo
    149 rm
    134 awk
    115 pac
    110 sudo
    102 l

$ history | awk 'BEGIN {FS="[ \t]+|\\|"} {if($3 ~ /sudo/) print $4; else print $3}' | sort | uniq -c | sort -nr | head
    298 vim
    260 git
    189 find
    174 man
    168 echo
    153 rm
    134 awk
    115 pac
    102 l
     95 cd

ท่านสามารถเข้าดูกระโดดในข้อหาสำหรับvim, rmฯลฯ


1
อาจต้องการให้เครดิตแหล่งที่มาของคุณในคำตอบของคุณ: stackoverflow.com/a/68390/1210983
ohaal

3
@ โอฮาลเชื่อหรือไม่ฉันไม่รู้เกี่ยวกับแหล่งที่มาด้านบน ขอแสดงความนับถือนี้เป็นปัญหาที่เกิดขึ้นในห้องปฏิบัติการของเพื่อนสิ่งที่กำลังศึกษาอยู่ที่วิทยาการคอมพิวเตอร์ของ Iasi
Radu Rădeanu

@muru การแก้ไขที่คุณทำกับ sudo ไม่ได้ผลเหมือนsudo -iเพราะมันทำให้ฉัน-iเป็นคำสั่ง
geek1011

1
@ geek1011 sudo -iเริ่มเชลล์ใหม่ ประวัติศาสตร์ที่ไม่ได้อยู่ในประวัติศาสตร์เปลือกของคุณ แต่ในroot's เห็นได้ชัดว่าคำสั่งเหล่านี้ใช้ไม่ได้กับกรณีขอบจำนวนมาก ไม่มีวิธีที่จะจัดการกับคำสั่งที่เป็นไปได้ทั้งหมดโดยไม่ต้องเขียน parser ของคุณเองสำหรับภาษาของเชลล์
muru

1
@ geek1011 แน่นอนเพิ่มการตรวจสอบอีกเช่น:if ($3 ~ /sudo/ && $4 !~ /^-/)
muru

3

คำสั่งด้านล่างจะแสดงรายการtop 10คำสั่งเทอร์มินัลที่ใช้บ่อยที่สุด

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

คำสั่งเพื่อแสดงรายการคำสั่งทั้งหมดที่ใช้บ่อยที่สุดในเทอร์มินัล

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn

2

Fish & Bash - คำถามไม่ได้ระบุเปลือกเฉพาะเจาะจงเพียง 'terminal' เปลี่ยนหัวเป็นหมายเลขใดก็ได้ที่คุณต้องการ

ปลา

history | awk '{print $1}' | sort | uniq --count | sort --numeric-sort --reverse | head -10

517 git
314 drush
197 sudo
171 cd
115 man
103 echo
 95 vi
 81 dig
 67 set
 66 ls

หนึ่งทุบตีนี้ดูเหมือนว่าจะทำงานและเป็นบิตที่สั้นกว่าและง่ายต่อการเข้าใจกว่าคำตอบอื่น ๆ ฉันชอบตัวเลือกแบบยาวเพื่อช่วยให้สามารถอ่านได้ในตัวอย่างประเภทนี้

ทุบตี

history | awk '{print $2}' | sort | uniq --count | sort --numeric-sort --reverse | head -10

73 drush
72 exit
65 sudo
46 g
40 echo
35 ll
34 tmux
30 history
30 fish
27 mux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.