本文主要講解 Shell 命令合集剂邮,以及對(duì)控制臺(tái)的使用技巧涌哲。在這之前你需要掌握如下三部分的知識(shí)內(nèi)容:
- 需要熟悉掌握 Linux蜗细;
- 需要了解一些 Shell 基礎(chǔ),課時(shí)中會(huì)介紹一些常見(jiàn)的 Shell 命令合集;
- 需要了解 TCP 三次握手原理舒憾,這個(gè)課時(shí)的 Shell 命令合集包含對(duì)計(jì)算機(jī)進(jìn)行網(wǎng)絡(luò)分析。
控制臺(tái)使用技巧
首先,掌握控制臺(tái)的使用技巧后可以幫助我們熟練快速地操作控制臺(tái)拳话,提高工作效率;還可以通過(guò)快捷鍵方式避免大量的命令輸入种吸,減少出錯(cuò)產(chǎn)生的概率弃衍。那么都有哪些快捷鍵供我們使用呢,基于我的運(yùn)維工作經(jīng)驗(yàn)匯總?cè)缦拢?/p>
- 操作快捷鍵
Ctrl + r:可以快速查找歷史命令坚俗;
Ctrl + l:可以清理控制臺(tái)屏幕镜盯;
Ctrl + a \ Ctrl + e:移動(dòng)光標(biāo)到命令行首\行尾;
Ctrl + w \ Ctrl + k:刪除光標(biāo)之前\之后的內(nèi)容猖败。
- VIM文件編輯快捷鍵
快捷鍵ZZ:文件保存并退出速缆。
- 進(jìn)程操作快捷鍵
Ctrl + c:強(qiáng)制終止程序的執(zhí)行;
Ctrl + z:掛起一個(gè)進(jìn)程恩闻;
Ctrl + d:終端中輸入 exit 后回車艺糜。
- linux命令中快捷鍵(top)
Shift + p:根據(jù) CPU 使用率排序;
Shift + m:根據(jù)內(nèi)存占用排序幢尚。
Shell 命令合集
需要注意的是這里的 Shell 命令合集不是簡(jiǎn)單的單一命令使用破停,而是 Shell 命令組合的使用,它們的適用場(chǎng)景雖然平時(shí)可能很少用到尉剩,但通過(guò)加強(qiáng)記憶你能夠在遇到此類場(chǎng)景時(shí)能夠得心應(yīng)手真慢,而不必臨時(shí)查找或根據(jù)經(jīng)驗(yàn)拼湊,同時(shí)期望通過(guò)這些組合命令的學(xué)習(xí)后你對(duì)基礎(chǔ)命令的理解可以得到進(jìn)一步的提升理茎。
首先黑界,我們需要對(duì) Shell 命令合集做一個(gè)分類管嬉。
- 空間分析
場(chǎng)景1:磁盤空間不足,需快速定位日志目錄朗鸠;
場(chǎng)景2:系統(tǒng)產(chǎn)生很多碎片文件蚯撩,導(dǎo)致 inode 資源不足。
- 指定文件操作
場(chǎng)景1:批量查找文件作內(nèi)容替換烛占;
場(chǎng)景2:批量查找文件作拷貝打包求厕。
- 鏈接狀態(tài)分析
場(chǎng)景:想了解用戶請(qǐng)求所建立的網(wǎng)絡(luò)連接狀態(tài)分析
- IP 信息提取
場(chǎng)景:shell 腳本中希望快速提取到本機(jī) IP。
空間分析-場(chǎng)景1
該場(chǎng)景主要應(yīng)用于當(dāng)磁盤空間不足扰楼,需要快速定位或者對(duì)文件使用率進(jìn)行排序呀癣,需要查看哪一些文件目錄或者文件占用的空間比較多,就需要如下組合命令弦赖。
du -x --max-depth=1 / |sort -k1 -nr
這一個(gè)命令組合由兩個(gè) Shell 命令組成项栏,前面的 du 命令進(jìn)行磁盤統(tǒng)計(jì),第二個(gè) sort 命令對(duì)統(tǒng)計(jì)后的數(shù)據(jù)進(jìn)行排序蹬竖,中間通過(guò) | 管道符來(lái)傳遞數(shù)據(jù)沼沈。管道符 | 的作用是將前一個(gè)命令的輸出傳遞到下一個(gè)命令的輸入。
du 命令中 -x 參數(shù)表示跳過(guò)其他文件系統(tǒng)币厕,也就是只分析本文件系統(tǒng)里的文件列另,它可以幫助我們排除一些非本文件系統(tǒng)的統(tǒng)計(jì)信息,這樣執(zhí)行速度會(huì)更快也不容易出現(xiàn)一些額外的干擾項(xiàng)旦装。--max-depth參數(shù)設(shè)置為 1页衙,這樣就可以統(tǒng)計(jì)出根目錄下第一級(jí)目錄中的所有文件的大小。第二個(gè)命令sort中 -k 參數(shù)指明具體按照哪一列進(jìn)行排序阴绢,-n 參數(shù)表示只對(duì)數(shù)值進(jìn)行排序店乐,而 -r 參數(shù)表示反向排序,那整體分析sort 這一段命令的意思就是指定第一列并按照數(shù)據(jù)大小做反序排序呻袭。
空間分析-場(chǎng)景2
場(chǎng)景 2 適用于系統(tǒng)上產(chǎn)生很多碎片文件時(shí)眨八,隨之產(chǎn)生大量的 Inode , Inode 用于存放著文件系統(tǒng)中文件的源數(shù)據(jù)左电,Inode過(guò)渡的使用會(huì)導(dǎo)致系統(tǒng) Inode 資源不足廉侧。這種情況是不正常的,這個(gè)時(shí)候分析如果通過(guò)du 命令指能具體展示出磁盤空間的使用情況篓足,但并不能分析出具體目錄下產(chǎn)生了多少碎片文件段誊,我們就需要如下的命令組合來(lái)對(duì)文件進(jìn)行統(tǒng)計(jì)分析。
find -type f|awk -F/ -v OFS=/ '{$NF="";dir[$0]++}END{for(i in dir)print dir[i]""i}'|sort -k1 -nr|head
基于管道可以將這個(gè)命令組合切割成四部分纷纫,分別是 find枕扫、awk陪腌、sort辱魁、head 命令烟瞧。
其中 find 命令通過(guò) -type f 參數(shù)查找指定文件類型的文件,然后將查找結(jié)果通過(guò)管道傳遞給 awk染簇,它可以把文本內(nèi)容按行進(jìn)行格式化輸出并展示参滴,-F / 指定處理文件時(shí)字符串之間以 / 進(jìn)行分割,-v OFS=/ 表示文件顯示結(jié)果時(shí)以 / 進(jìn)行分割展示锻弓。對(duì)于awk命令整體規(guī)則而言有一個(gè) {} END {} 格式砾赔,前面的 {} 表示行處理操作,END{} 表示行處理后需要進(jìn)行整體結(jié)果出青灼。在行處理操作邏輯中暴心,設(shè)置$NF 為空表示將每一行的文件名信息去除,從而只保留目錄路徑杂拨,dir 是一個(gè)自增數(shù)組专普,用于統(tǒng)計(jì)結(jié)果。最后通過(guò) for 循環(huán)進(jìn)行遍歷輸出dir關(guān)聯(lián)數(shù)組中所有行信息弹沽。
因?yàn)檫@個(gè)命令組合比較復(fù)雜檀夹,我們?cè)诳刂婆_(tái)中來(lái)看具體的演示,首先在控制臺(tái)中輸入這一串命令組合策橘。
你可以看到在當(dāng)前目錄路徑通過(guò)執(zhí)行命令炸渡,結(jié)果中已經(jīng)把每一個(gè)產(chǎn)生文件的路徑都展示出來(lái)了,并且前面還會(huì)顯示在每一個(gè)路徑下一共包含了多少文件丽已,如果我們系統(tǒng) 提示inode 使用率問(wèn)題蚌堵,需要分析出哪個(gè)路徑下的文件數(shù)最多,這時(shí)就可以通過(guò) 這個(gè)組合命令來(lái)進(jìn)行分析沛婴。
文件操作-場(chǎng)景1
文件操作的場(chǎng)景主要有兩個(gè)辰斋,第一個(gè)場(chǎng)是批量文件內(nèi)容需要進(jìn)行替換,也就是當(dāng)我們?cè)谝粋€(gè)文件目錄下面有多級(jí)子目錄瘸味,并且子目錄中有大量的文件宫仗,而我們需要對(duì)目錄下的某一個(gè)名稱的文件批量的查找替換內(nèi)容。面對(duì)這種場(chǎng)景我們可以使用如下的組合命令:
find ./ -type f -name test.txt -exec sed -i "s/aaaaaa/bbbbbb/g" {} \;
我們通過(guò) find + 路徑 的方式查找需要批量修改的指定的文件名旁仿,比如命令中的 test.txt 文件藕夫,查找到文件后通過(guò) find 自帶的參數(shù) exec 將結(jié)果傳遞給另外一條命令 sed 來(lái)進(jìn)行下一步命令的處理。
find 命令中枯冈,-name 參數(shù)指定查找的文件名毅贮,-exec 參數(shù)將查找到的內(nèi)容傳遞給下一個(gè)命令去繼續(xù)執(zhí)行相關(guān)邏輯,sed 命令主要對(duì)文件內(nèi)容進(jìn)行替換尘奏,這里會(huì)將 consumer 文件中的 aaaaaa 替換成bbbbbb滩褥,這就是一個(gè)批量查找替換的操作。
文件操作-場(chǎng)景2
文件操作的第二種場(chǎng)景是我們需要對(duì)文件進(jìn)行批量的打包炫加、拷貝瑰煎,你可以使用下面這樣的一個(gè)組合命令:
(find . -name "*.txt"|xargs tar -cvf test.tar) && cp -f test.tar /home/.
首先括號(hào)中包含兩條命令铺然,它們使用管道符進(jìn)行連接,括號(hào)外通過(guò)"&&"符號(hào)與第三條命令進(jìn)行連接酒甸,也就是我們首先需要執(zhí)行括號(hào)中的組合命令魄健,先查找所有.txt文件,然后將結(jié)果傳遞給 xargs 命令進(jìn)行打包插勤,如果打包成功后才將壓縮包傳遞給 cp 命令進(jìn)行拷貝沽瘦。
網(wǎng)絡(luò)連接狀態(tài)分析
對(duì)于網(wǎng)絡(luò)連接狀態(tài)分析是運(yùn)維工程師經(jīng)常需要做的事情,因?yàn)槲覀兘?jīng)常需要了解系統(tǒng)對(duì)外提供的網(wǎng)絡(luò)服務(wù)是否正常农尖,并了解它們的連接狀態(tài)析恋,這時(shí)就可以通過(guò)如下的命令組合進(jìn)行操作:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
這個(gè)命令組合的構(gòu)成,整體上來(lái)說(shuō)它由兩個(gè)命令構(gòu)成盛卡,第一個(gè)命令是netstat -n绿满,這個(gè)命令負(fù)責(zé)查看主機(jī)上的所有 TCP、UDP 連接信息窟扑,而awk 命令則負(fù)責(zé)對(duì)這些信息進(jìn)行進(jìn)一步的處理喇颁,awk 后有一個(gè)用兩個(gè) "斜杠" 括起來(lái)的正則表達(dá)式,主要用來(lái)匹配以 tcp 開頭的每一行信息嚎货,所以這里的正則表達(dá)式起到了一個(gè)過(guò)濾的作用(只分析tcp的連接)橘霎,后面則是對(duì)信息過(guò)濾后進(jìn)行具體的統(tǒng)計(jì)和輸出。
IP信息提取
而另外一個(gè)場(chǎng)景就是提取主機(jī)上的 IP 信息殖属,這里推薦使用如下的命令組合:
ip a|grep "global"|awk '{print $2}'|awk -F/ '{print $1}'
它的結(jié)構(gòu)組成也比較簡(jiǎn)單姐叁,分別是由四個(gè)命令組合而成,前面的 ip a 負(fù)責(zé)查看主機(jī)上所有網(wǎng)卡的信息洗显,然后通過(guò) grep 進(jìn)行條件過(guò)濾外潜,再通過(guò) awk 實(shí)現(xiàn)第二列內(nèi)容輸出,最后通過(guò) awk 以指定 / 作為分隔符來(lái)打印第一列的信息挠唆。
常見(jiàn)問(wèn)題答疑
最后处窥,分享一下 對(duì)Shell 常有的幾個(gè)疑問(wèn)。
問(wèn)題一:Shell 適不適合作多并發(fā)任務(wù)玄组?
答案:不適合滔驾,在 Shell 中一般需要通過(guò) nohup 方式將需要并發(fā)執(zhí)行的命令放入后臺(tái),但這樣操作存在一些問(wèn)題俄讹,包括:
- 進(jìn)程的狀態(tài)不好控制哆致;
- 進(jìn)程間信息共享一般以文件方式。
等等,所以我們當(dāng)需要進(jìn)行大的自動(dòng)化工程任務(wù)需要作并發(fā)任務(wù)時(shí) 建議選擇 Python Go PHP等語(yǔ)言患膛。
問(wèn)題二:Shell 的遠(yuǎn)程執(zhí)行命令方式是什么摊阀?
答案:當(dāng)Shell進(jìn)行遠(yuǎn)程執(zhí)行命令時(shí),通常通過(guò)ssh xx@xxx.xxx.xxx.xxx /home/xx/test.sh參數(shù)的方式,但如果是批量主機(jī)任務(wù)胞此,建議選擇ansible臣咖、saltstack 這樣成熟且專業(yè)的工具實(shí)現(xiàn)。
問(wèn)題三:Shell 適合用在什么場(chǎng)景中豌鹤?
答案:Shell 適合用在追求運(yùn)維高效(非性能高效)要求的簡(jiǎn)單場(chǎng)景中亡哄,如日志切割枝缔、進(jìn)程分析布疙、系統(tǒng)初始化等。
<center>未完待續(xù)愿卸,敬請(qǐng)期待灵临!</center>
文章優(yōu)先發(fā)布于公眾號(hào)運(yùn)維大師兄,更多精彩等你趴荸!