輕松掌握 Linux 文本處理三劍客:grep、awk 和 sed 實戰(zhàn)演練

為什么要學(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 三劍客介紹

image
image
  • 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

image
image

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

image
image
image

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

image

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

?著作權(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)容

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