如何通過(guò) Shell 腳本分析你的“歷史命令”?揭秘最常用的終端操作!
在終端中,history 命令是每位開(kāi)發(fā)者或系統(tǒng)管理員的“時(shí)光機(jī)”——它記錄了你在命令行中輸入的每一條指令。但你是否好奇,自己最常用的命令是什么?哪些操作被反復(fù)執(zhí)行卻可以?xún)?yōu)化?當(dāng)然可以!讓我們一起通過(guò)一行簡(jiǎn)單的腳本,探索history背后隱藏的小秘密吧!同時(shí),我們還會(huì)深入淺出地解析它的工作原理哦。
為什么需要統(tǒng)計(jì)歷史命令?
- 優(yōu)化工作流:發(fā)現(xiàn)高頻命令后,可以為其設(shè)置別名(alias),提升效率。
- 排查重復(fù)操作:識(shí)別無(wú)意義的重復(fù)命令,減少冗余步驟。
- 安全審計(jì):檢查是否有異常命令(如 rm 誤操作)。
- 學(xué)習(xí)習(xí)慣:了解自己的操作模式,幫助記憶復(fù)雜命令。
一鍵統(tǒng)計(jì)腳本:快速上手
以下腳本可直接運(yùn)行,統(tǒng)計(jì)并輸出使用頻率最高的前10個(gè)命令:
#!/bin/bash
if [! -f ~/.bash_history ];then
echo "錯(cuò)誤:未找到~/.bash_history文件"
exit 1
if
cat ~/.bash_history | sed -E 's/^[[:space:]]*[0-9]+\*?[[:space:]]+([^[:space:]]+[[:space:]]+){0,2}//' | sort | uniq -c | sort -nr | head -n 10
運(yùn)行效果示例:
25 git status
18 ls -l
12 python main.py
10 docker ps
8 ssh user@server
...
腳本逐行解析:從魔法到原理
(1) history
輸出所有歷史命令,默認(rèn)格式為:
1000 2024-01-01 10:00:00 git status
1001 2024-01-01 10:00:05 ls -l
...
包含編號(hào)、時(shí)間戳(若啟用)和具體命令。
(2) sed -E 's/...//'
使用正則表達(dá)式清理數(shù)據(jù):
- 刪除行首的編號(hào):匹配 ^[[:space:]]*[0-9]+\*?,如 1000 或 1001*。
- 刪除時(shí)間戳(若存在):匹配 ([^[:space:]]+[[:space:]]+){0,2},如 2024-01-01 10:00:00。最終保留的只有實(shí)際輸入的命令。
(3) sort | uniq -c
- sort 將相同命令歸類(lèi),為 uniq 統(tǒng)計(jì)做準(zhǔn)備。
- uniq -c 計(jì)算每個(gè)命令的出現(xiàn)次數(shù)。
(4) sort -nr | head -n 10
- sort -nr 按次數(shù)倒序排列(數(shù)字從高到低)。
- head -n 10 僅顯示前10個(gè)高頻命令。
進(jìn)階優(yōu)化:應(yīng)對(duì)不同場(chǎng)景
(1) 忽略命令參數(shù)
若只需統(tǒng)計(jì)基礎(chǔ)命令(如 git 而非 git status),可提取每行的第一個(gè)字段:
history | sed -E 's/^[[:space:]]*[0-9]+\*?[[:space:]]+([^[:space:]]+[[:space:]]+){0,2}//' | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
(2) 處理 zsh 的歷史記錄
Zsh 默認(rèn)歷史文件為 ~/.zsh_history,格式與 Bash 不同。可改用:
awk -F ';' '{print $2}' ~/.zsh_history | sort | uniq -c | sort -nr | head -n 10
(3) 持久化統(tǒng)計(jì)結(jié)果
將高頻命令保存到文件,用于長(zhǎng)期分析:
./history_stats.sh >> command_usage.log
應(yīng)用場(chǎng)景示例
(1) 別名優(yōu)化
若發(fā)現(xiàn) git status 出現(xiàn)次數(shù)最多,可將其設(shè)為別名:
echo "alias gs='git status'" >> ~/.bashrc
(2) 安全監(jiān)控
定期檢查是否有危險(xiǎn)命令(如 rm -rf /),可擴(kuò)展腳本加入告警功能。
(3) 團(tuán)隊(duì)協(xié)作分析
統(tǒng)計(jì)多人共享服務(wù)器的歷史記錄(需權(quán)限),識(shí)別常用工具或潛在問(wèn)題。
結(jié)語(yǔ):讓終端成為你的效率伙伴
通過(guò)這腳本,我們不僅看到了自己的操作習(xí)慣,更能將數(shù)據(jù)轉(zhuǎn)化為優(yōu)化工作流的動(dòng)力。嘗試運(yùn)行這個(gè)腳本,看看你的“命令行人格”是什么樣的吧!或許你會(huì)發(fā)現(xiàn),自己原來(lái)是個(gè) git 的重度用戶(hù),或者是一個(gè) docker 的狂熱愛(ài)好者——而這,就是技術(shù)人的浪漫。