運維高手一:工作累積的最常用 Shell 命令合集及使用技巧

本文主要講解 Shell 命令合集,以及對控制臺的使用技巧。在這之前你需要掌握如下三部分的知識內(nèi)容:

  • 需要熟悉掌握 Linux;
  • 需要了解一些 Shell 基礎(chǔ),課時中會介紹一些常見的 Shell 命令合集;
  • 需要了解 TCP 三次握手原理,這個課時的 Shell 命令合集包含對計算機(jī)進(jìn)行網(wǎng)絡(luò)分析。

控制臺使用技巧
首先,掌握控制臺的使用技巧后可以幫助我們熟練快速地操作控制臺,提高工作效率;還可以通過快捷鍵方式避免大量的命令輸入,減少出錯產(chǎn)生的概率。那么都有哪些快捷鍵供我們使用呢,基于我的運維工作經(jīng)驗匯總?cè)缦拢?/p>

  • 操作快捷鍵

Ctrl + r:可以快速查找歷史命令;
Ctrl + l:可以清理控制臺屏幕;
Ctrl + a \ Ctrl + e:移動光標(biāo)到命令行首\行尾;
Ctrl + w \ Ctrl + k:刪除光標(biāo)之前\之后的內(nèi)容。

  • VIM文件編輯快捷鍵

快捷鍵ZZ:文件保存并退出。

  • 進(jìn)程操作快捷鍵

Ctrl + c:強(qiáng)制終止程序的執(zhí)行;
Ctrl + z:掛起一個進(jìn)程;
Ctrl + d:終端中輸入 exit 后回車。

  • linux命令中快捷鍵(top)

Shift + p:根據(jù) CPU 使用率排序;
Shift + m:根據(jù)內(nèi)存占用排序。

Shell 命令合集

需要注意的是這里的 Shell 命令合集不是簡單的單一命令使用,而是 Shell 命令組合的使用,它們的適用場景雖然平時可能很少用到,但通過加強(qiáng)記憶你能夠在遇到此類場景時能夠得心應(yīng)手,而不必臨時查找或根據(jù)經(jīng)驗拼湊,同時期望通過這些組合命令的學(xué)習(xí)后你對基礎(chǔ)命令的理解可以得到進(jìn)一步的提升。

首先,我們需要對 Shell 命令合集做一個分類。

  • 空間分析

場景1:磁盤空間不足,需快速定位日志目錄;
場景2:系統(tǒng)產(chǎn)生很多碎片文件,導(dǎo)致 inode 資源不足。

  • 指定文件操作

場景1:批量查找文件作內(nèi)容替換;
場景2:批量查找文件作拷貝打包。

  • 鏈接狀態(tài)分析

場景:想了解用戶請求所建立的網(wǎng)絡(luò)連接狀態(tài)分析

  • IP 信息提取

場景:shell 腳本中希望快速提取到本機(jī) IP。

空間分析-場景1

該場景主要應(yīng)用于當(dāng)磁盤空間不足,需要快速定位或者對文件使用率進(jìn)行排序,需要查看哪一些文件目錄或者文件占用的空間比較多,就需要如下組合命令。

du -x --max-depth=1 / |sort -k1 -nr

這一個命令組合由兩個 Shell 命令組成,前面的 du 命令進(jìn)行磁盤統(tǒng)計,第二個 sort 命令對統(tǒng)計后的數(shù)據(jù)進(jìn)行排序,中間通過 | 管道符來傳遞數(shù)據(jù)。管道符 | 的作用是將前一個命令的輸出傳遞到下一個命令的輸入。

du 命令中 -x 參數(shù)表示跳過其他文件系統(tǒng),也就是只分析本文件系統(tǒng)里的文件,它可以幫助我們排除一些非本文件系統(tǒng)的統(tǒng)計信息,這樣執(zhí)行速度會更快也不容易出現(xiàn)一些額外的干擾項。--max-depth參數(shù)設(shè)置為 1,這樣就可以統(tǒng)計出根目錄下第一級目錄中的所有文件的大小。第二個命令sort中 -k 參數(shù)指明具體按照哪一列進(jìn)行排序,-n 參數(shù)表示只對數(shù)值進(jìn)行排序,而 -r 參數(shù)表示反向排序,那整體分析sort 這一段命令的意思就是指定第一列并按照數(shù)據(jù)大小做反序排序。

空間分析-場景2

場景 2 適用于系統(tǒng)上產(chǎn)生很多碎片文件時,隨之產(chǎn)生大量的 Inode , Inode 用于存放著文件系統(tǒng)中文件的源數(shù)據(jù),Inode過渡的使用會導(dǎo)致系統(tǒng) Inode 資源不足。這種情況是不正常的,這個時候分析如果通過du 命令指能具體展示出磁盤空間的使用情況,但并不能分析出具體目錄下產(chǎn)生了多少碎片文件,我們就需要如下的命令組合來對文件進(jìn)行統(tǒng)計分析。

find -type f|awk -F/ -v OFS=/ '{$NF="";dir[$0]++}END{for(i in dir)print dir[i]""i}'|sort -k1 -nr|head

基于管道可以將這個命令組合切割成四部分,分別是 find、awk、sort、head 命令。

其中 find 命令通過 -type f 參數(shù)查找指定文件類型的文件,然后將查找結(jié)果通過管道傳遞給 awk,它可以把文本內(nèi)容按行進(jìn)行格式化輸出并展示,-F / 指定處理文件時字符串之間以 / 進(jìn)行分割,-v OFS=/ 表示文件顯示結(jié)果時以 / 進(jìn)行分割展示。對于awk命令整體規(guī)則而言有一個 {} END {} 格式,前面的 {} 表示行處理操作,END{} 表示行處理后需要進(jìn)行整體結(jié)果出。在行處理操作邏輯中,設(shè)置$NF 為空表示將每一行的文件名信息去除,從而只保留目錄路徑,dir 是一個自增數(shù)組,用于統(tǒng)計結(jié)果。最后通過 for 循環(huán)進(jìn)行遍歷輸出dir關(guān)聯(lián)數(shù)組中所有行信息。

因為這個命令組合比較復(fù)雜,我們在控制臺中來看具體的演示,首先在控制臺中輸入這一串命令組合。

14.png

你可以看到在當(dāng)前目錄路徑通過執(zhí)行命令,結(jié)果中已經(jīng)把每一個產(chǎn)生文件的路徑都展示出來了,并且前面還會顯示在每一個路徑下一共包含了多少文件,如果我們系統(tǒng) 提示inode 使用率問題,需要分析出哪個路徑下的文件數(shù)最多,這時就可以通過 這個組合命令來進(jìn)行分析。

文件操作-場景1

文件操作的場景主要有兩個,第一個場是批量文件內(nèi)容需要進(jìn)行替換,也就是當(dāng)我們在一個文件目錄下面有多級子目錄,并且子目錄中有大量的文件,而我們需要對目錄下的某一個名稱的文件批量的查找替換內(nèi)容。面對這種場景我們可以使用如下的組合命令:

find ./ -type f -name test.txt -exec sed -i "s/aaaaaa/bbbbbb/g" {} \;

我們通過 find + 路徑 的方式查找需要批量修改的指定的文件名,比如命令中的 test.txt 文件,查找到文件后通過 find 自帶的參數(shù) exec 將結(jié)果傳遞給另外一條命令 sed 來進(jìn)行下一步命令的處理。

find 命令中,-name 參數(shù)指定查找的文件名,-exec 參數(shù)將查找到的內(nèi)容傳遞給下一個命令去繼續(xù)執(zhí)行相關(guān)邏輯,sed 命令主要對文件內(nèi)容進(jìn)行替換,這里會將 consumer 文件中的 aaaaaa 替換成bbbbbb,這就是一個批量查找替換的操作。

文件操作-場景2

文件操作的第二種場景是我們需要對文件進(jìn)行批量的打包、拷貝,你可以使用下面這樣的一個組合命令:

(find . -name "*.txt"|xargs tar -cvf test.tar) && cp -f test.tar /home/.

首先括號中包含兩條命令,它們使用管道符進(jìn)行連接,括號外通過"&&"符號與第三條命令進(jìn)行連接,也就是我們首先需要執(zhí)行括號中的組合命令,先查找所有.txt文件,然后將結(jié)果傳遞給 xargs 命令進(jìn)行打包,如果打包成功后才將壓縮包傳遞給 cp 命令進(jìn)行拷貝。

網(wǎng)絡(luò)連接狀態(tài)分析

對于網(wǎng)絡(luò)連接狀態(tài)分析是運維工程師經(jīng)常需要做的事情,因為我們經(jīng)常需要了解系統(tǒng)對外提供的網(wǎng)絡(luò)服務(wù)是否正常,并了解它們的連接狀態(tài),這時就可以通過如下的命令組合進(jìn)行操作:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

這個命令組合的構(gòu)成,整體上來說它由兩個命令構(gòu)成,第一個命令是netstat -n,這個命令負(fù)責(zé)查看主機(jī)上的所有 TCP、UDP 連接信息,而awk 命令則負(fù)責(zé)對這些信息進(jìn)行進(jìn)一步的處理,awk 后有一個用兩個 "斜杠" 括起來的正則表達(dá)式,主要用來匹配以 tcp 開頭的每一行信息,所以這里的正則表達(dá)式起到了一個過濾的作用(只分析tcp的連接),后面則是對信息過濾后進(jìn)行具體的統(tǒng)計和輸出。

IP信息提取

而另外一個場景就是提取主機(jī)上的 IP 信息,這里推薦使用如下的命令組合:

ip a|grep "global"|awk '{print $2}'|awk -F/ '{print $1}'

它的結(jié)構(gòu)組成也比較簡單,分別是由四個命令組合而成,前面的 ip a 負(fù)責(zé)查看主機(jī)上所有網(wǎng)卡的信息,然后通過 grep 進(jìn)行條件過濾,再通過 awk 實現(xiàn)第二列內(nèi)容輸出,最后通過 awk 以指定 / 作為分隔符來打印第一列的信息。

常見問題答疑

最后,分享一下 對Shell 常有的幾個疑問。
問題一:Shell 適不適合作多并發(fā)任務(wù)?
答案:不適合,在 Shell 中一般需要通過 nohup 方式將需要并發(fā)執(zhí)行的命令放入后臺,但這樣操作存在一些問題,包括:

  • 進(jìn)程的狀態(tài)不好控制;
  • 進(jìn)程間信息共享一般以文件方式。

等等,所以我們當(dāng)需要進(jìn)行大的自動化工程任務(wù)需要作并發(fā)任務(wù)時 建議選擇 Python Go PHP等語言。

問題二:Shell 的遠(yuǎn)程執(zhí)行命令方式是什么?
答案:當(dāng)Shell進(jìn)行遠(yuǎn)程執(zhí)行命令時,通常通過ssh xx@xxx.xxx.xxx.xxx /home/xx/test.sh參數(shù)的方式,但如果是批量主機(jī)任務(wù),建議選擇ansible、saltstack 這樣成熟且專業(yè)的工具實現(xiàn)。
問題三:Shell 適合用在什么場景中?
答案:Shell 適合用在追求運維高效(非性能高效)要求的簡單場景中,如日志切割、進(jìn)程分析、系統(tǒng)初始化等。

<center>未完待續(xù),敬請期待!</center>
文章優(yōu)先發(fā)布于公眾號運維大師兄,更多精彩等你!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,727評論 0 5
  • 1、文件和目錄: # cd /home 進(jìn)入 '/home' 目錄 # cd .. ...
    XDgbh閱讀 2,161評論 0 1
  • 第 2 章 SHELL 基礎(chǔ)知識2.1 shell腳本我們在上面簡單介紹了一下什么是shell腳本,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,652評論 0 0
  • 1. 硬鏈接和軟連接區(qū)別 硬連接-------指通過索引節(jié)點來進(jìn)行連接。在Linux的文件系統(tǒng)中,保存在磁盤分區(qū)...
    杰倫哎呦哎呦閱讀 2,542評論 0 2
  • 命令行的藝術(shù) 前言 基礎(chǔ) 日常使用 文件及數(shù)據(jù)處理 系統(tǒng)調(diào)試 單行腳本 冷門但有用 僅限 OS X 系統(tǒng) 僅限 W...
    進(jìn)擊的諾基亞閱讀 3,931評論 0 19

友情鏈接更多精彩內(nèi)容