測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

本文為霍格沃茲測試學院優秀學員課程學習系列筆記,希望大吉可以從中學到想學習的知識。

(本篇為繼續上篇的內容)

結果展示:

(1)

(2)[sqavbxb9efockpz ~]$ awk '$9!~/200/{print $9}' nginx.log | sort | uniq -c | sort -nr


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

再結合 awk ‘BBEGIN{}END{}’ 命令,以統計當前用戶數目的例子來展示命令用法

使用

cat /etc/passwd

命令來查看本機用戶,我們需要提取出用戶名稱並加上數字序號顯示出來,達到這種效果:


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

用戶信息:

利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

思路:

* awk運行前先定義序號索引0,用來遞增保存用戶
* 利用awk將用戶提取出來,按索引分別保存;
* 切片結束後再按行數進行循環,將數字序號與第一步保存的信息拼接打印
* 注意:

cat /etc/passwd

打印出的結果中,最上方的註釋需要處理跳過


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇


3. sed

利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

sed:stream editor 根據定位到的數據行修改數據

1、sed [-nefri] [動作]

2、參數:

3、-n :使用安靜(slient)模式。只有經過sed特殊處理的那一行(或者操作)才會被列出來。一般與p配合使用

4、-e :直接在命令行模式上進行sed的動作編輯

5、-f :直接將sed動作寫在一個文件內,-f filename則可以執行filename 內的sed動作。

6、-r :sed的動作支持的是拓展正則表達式的語法(默認是基礎正則表達式的語法)

7、-i :直接修改讀取的文件內容,而不是由屏幕輸出

8、動作說明:[[n1][,n2]]function

9、n1,n2 :不見得會存在,一般代表選擇進行動作的行數,舉例來說,如果我的動作是需要在10到20之間進行的,則“10,20[動作行為]”

10、

11、function有下面這些參數:

12、a :新增

13、d :刪除 (比較重要,測試工作中對數據處理時可快速去除無用信息,比如註釋行,空白行等)

14、i :插入

15、p :打印 (一般與-n配合使用)

16、s :替換(重中之重!!!,s參數可以說是日常測試工作中對數據用sed清理過濾時使用率最高的了)


sed 修改表達式:

sed 's/待修改/修改結果/'


注意說明:

表達式單引號中的s表示修改,/ 符號表示分隔,實際上將/換成其他符號也可以,只要能起到分隔作用就OK。

1、[16210504@izuf60jasqavbxb9efockpz ~]$ echo "aaa|bbb}|cccbbb" | sed 's/bbb/BBB/'

2、aaa|BBB}|cccbbb

3、[16210504@izuf60jasqavbxb9efockpz ~]$ echo "aaa|bbb}|cccbbb" | sed 's#bbb#BBB#'

4、aaa|BBB}|cccbbb


若想講目標中所有的字段都替換,需要在命令最後加上g:

1、[16210504@izuf60jasqavbxb9efockpz ~]$ echo "aaa|bbb}|cccbbb" | sed 's/bbb/BBB/g'

2、aaa|BBB}|cccBBB

sed還可以修改文件中的內容,現在有文件text.txt,內容如下:


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

用sed 's/hello/HELLO/' text.txt命令將文件中的hello

替換成HELLO:

利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

但是此時我們打開源text.txt文件發下源文件內容並未改變:


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

注意說明:

sed 在修改文件內容時,是另外開闢了一塊模式空間,將修改後的內容放入並輸出,源文件並未修改;

這時如果想要修改源文件就需要藉助

-i

命令,另外為了防止誤操作修改文件,一般可以採取這種寫法:

sed -i.bak 's/hello/HELLO/' text.txt

,這種寫法在修改源文件的同時還會生成一份以.bak結尾的備份文件,相較安全。


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇


sed -e

命令可以直接在命令行模式上進行sed的動作編輯,但看解釋比較晦澀,來看一個實例:

需求: 現有一個1.txt的文本,內容如下:


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

​要將其中每行末尾的:都替換成@,將a替換成A,並在文本末尾加上“Sed Test”命令:


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇

實例演示:

1、[16210504@izuf60jasqavbxb9efockpz ~]$ sed -i -e 's/:/@/g' -i -e 's/a/A/' -i -e '$a Sed Test' 1.txt


利器 | 測試必會之 Linux 三劍客 ( grep / awk / sed ) 下篇



分享到:


相關文章: