為什么要學(xué)習(xí) Shell 腳本語言?
現(xiàn)代的互聯(lián)網(wǎng)架構(gòu)底層系統(tǒng)幾乎都是基于 Linux 操作系統(tǒng)構(gòu)建的,Linux 的核心價值在于提供了強(qiáng)大的系統(tǒng)內(nèi)核功能進(jìn)行文件管理和信息交互管理。
而 Shell 則是軟件研發(fā)人員高效控制和使用 Linux 的工具和橋梁。Shell 本身是 C 語言編寫的系統(tǒng)軟件,通常也叫命令行工具。它具有一個基礎(chǔ)的界面,用戶在這個界面通過 Shell 腳本語言(Shell Script)來訪問 Linux 操作系統(tǒng)內(nèi)核服務(wù)。
Tips:盡管通常我們把「Shell」和「Shell 腳本語言」都叫做 “Shell”,但其實這兩者是有本質(zhì)區(qū)別的。
在科幻電影里,我們經(jīng)??吹皆诎瞪{(diào)的屏幕上 Shell 腳本代碼在快速滾動,這簡直成為了 Geek/Hacker 的一個形象標(biāo)簽。而實際工作中,Shell 也備受開發(fā)、運維、測試人員甚至運營人員的青睞,幾乎是 IT 技術(shù)人員的必備技能。在軟件測試技術(shù)領(lǐng)域,Shell 腳本編程更是自動化測試技術(shù)的基石,是測試開發(fā)工程師的必備技能。
Shell 腳本語言編程有哪些優(yōu)勢呢?
Shell 腳本語言的優(yōu)勢在于能夠以最輕量級最快捷的速度處理 Linux 操作系統(tǒng)偏底層的業(yè)務(wù)。比如軟件的自動化安裝、更新版本,監(jiān)控報警,日志分析等。雖然其他高級編程語言如 PHP、Python、Ruby 等語言也能做到,但是效率和開發(fā)成本上會大打折扣,所謂“殺雞用牛刀”,有點得不償失。
成熟的技術(shù)人會摒棄華而不實的方法,而會根據(jù)不同的場景選擇最合適的工具去解決問題,樸實而高效。比如本文著重介紹的 Linux 三劍客:grep、awk 和 sed 就是 Linux 文本處理問題的最高效工具。
下面,我們將依次介紹 Linux 文本處理三劍客的基礎(chǔ)語法,使用場景和特性,以及給出對應(yīng)的實戰(zhàn)演練題目。
Shell 編程環(huán)境安裝
Windows 用戶,建議安裝 Git Bash 軟件。
Mac 用戶,建議安裝 iterm2 軟件。
ssh 工具
霍格沃茲測試學(xué)院的學(xué)員可以用自己的帳號登錄
ssh 手機(jī)號碼后8位@shell.testing-studio.com沒有 ssh 賬號的可以臨時用
ssh hogwarts2019@shell.testing-studio.com演練文檔:http://testerhome.com/tmp/nginx.log 保存了一份一天的 Nginx 訪問 log。
Linux 三劍客介紹


- grep:主要用于文本內(nèi)容查找,支持正則表達(dá)式。
- awk:主要用于文本內(nèi)容的分析處理,也常用于處理數(shù)據(jù),生成報告,非常適用于需要按列處理的數(shù)據(jù)。(現(xiàn)在很多Linux使用gawk)
- sed:全稱為 Stream editor ,主要用于文本內(nèi)容的編輯,默認(rèn)只處理模式空間,不改變原數(shù)據(jù),而且 sed 使用逐行讀取的方式處理數(shù)據(jù)。
grep


grep 示例 Shell 腳本代碼
ps -ef | grep bash
echo "ABC" | grep -i abc
ps -ef | grep bash | grep -v grep
echo "1234 7654" | grep -o "[0-9]4"
echo "1234 7654" | grep -oE "[0-9]4|76"
grep 實戰(zhàn)演練題目
- 找出 nginx.log 中所有 404 和 503 報錯的 log 數(shù)據(jù),取出前 3 條數(shù)據(jù),把命令貼到回復(fù)里。
- 找出 testerhome 首頁的所有 http 和 https 的鏈接。
awk



awk 示例 Shell 腳本代碼
ps | awk 'BEGIN{print "start"}{print $0}END{print "end"}'
awk '/ 404 | 500 /' /tmp/nginx.log
echo '1
2
3
4
5' | awk '/2/,/4/'
echo '1
2
3
4
5' | awk '$0>3'
ps | awk 'NR>1'
ps | awk '{print $NF}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | grep -v "^$" | awk 'BEGIN{FS="\n";ORS=":"}{print $0}END{printf "\n" }'
echo '1,10
2,20
3,30' | awk 'BEGIN{a=0;FS=","}{a+=$2}END{print a,a/NR}'
awk 'BEGIN{print 33*20*76/200/3}'
echo "123|456_789" | awk 'BEGIN{FS="\\||_"}{print $2}'
echo "123|456_789" | awk "BEGIN{FS=\"\\\\||_\"}{print \$2}" #盡量使用單引號
awk 實戰(zhàn)演練題目
- 找出 404 和 500 的數(shù)據(jù),只打印狀態(tài)碼這一列,然后排序去重。把命令貼到回復(fù)里
- 去 testerhome 首頁找到所有的 http 的連接,然后打印不帶 http 的純域名部分
sed

pattern表達(dá)式
- 20 30,35 行數(shù)與行數(shù)范圍
- /pattern/ 正則匹配
- //,// 正則匹配的區(qū)間
action
- d 刪除
- p 打印,通暢結(jié)合-n參數(shù)
- s/REGEXP/REPLACEMENT/[FLAGS]
- 替換時引用 \1 \2 匹配的字段
sed 示例 Shell 腳本代碼
ps | sed -n 1,3p
ps | sed 's/CMD/command/'
ps | sed -n '/ps/p'
echo '1
2
3
4
5' | sed -n '/3/,/4/p'
echo '1
2
3
4
5' | sed '/3/,/4/d'
ps | sed -e 's/CMD/command/' -e 's#00#20#g'
sed 實戰(zhàn)演練題目
對所有404 500 的數(shù)據(jù),統(tǒng)計出現(xiàn)這種狀態(tài)碼的url,需要對url匯總(匯總相似的url,把相同的資源但是變化的id去掉)去重,打印前5個出問題的路徑,把命令貼到回復(fù)里。
-
(文章來源于霍格沃茲測試學(xué)院)
點擊鏈接獲取更多文章
http://qrcode.testing-studio.com/f?from=jianshu=https://ceshiren.com/t/topic/3822