1.grep講解
(1)grep的用法

格式:grep + 引數 + 正則運算式+要匹配的內容
其中常用的引數如下:

(2)練習
- 查找
test.txt檔案中包含root的內容并顯示行號grep -n root test.txt - 查找
test.txt檔案中不包含root的內容并顯示行號grep -nv root test.txt - 查找以s開頭的內容
grep -E ^s test.txt - 查找以n結尾的內容
grep -E n$ test.txt
2.sed講解
(1)sed的用法
grep只能對文本內容進行查找,而sed可以對文本內容進行增刪改,

格式:sed [-e<script>] [-f <script檔案>]

script中常用的引數:

(2)練習
-
查看幫助檔案
方法一: man sed 方法二: sed -h -
在test.txt檔案的第四行后添加字串‘ouyi’
sed -e '4 a ouyi' test.txt 注意ouyi字串也會獨占一行,顯示為第五行, -
在在test.txt檔案的第二行前添加字串‘ouyi’
sed -e '2 i ouyi' test.txt 注意ouyi字串也會獨占一行,顯示為第二行, -
全域替換:將test.txt檔案中的所有的‘root‘替換為‘hello’
sed -e 's/root/hello/g' test.txt 注意:如果不加g引數,只會替換每行中的第一個 -
修改檔案內容:將test.txt檔案中的所有的‘root‘替換為‘hello’
sed -i 's/root/hello/g' test.txt 注意,我們之前使用sed -e來對檔案所做的更改,并沒有修改檔案本身,而使用sed -i會直接修改掉原檔案
總結:sed和grep都是對檔案進行操作,但grep只能對檔案進行匹配查找,而sed更多是對檔案進行修改后顯示,
3.awk講解
(1)awk用法


格式:awk 'pattern+action' 檔案名

常用引數如下:


(2)練習
1.列印/etc/passwd檔案中的包含’root‘關鍵字的所有內容
- 1.先cat查看相關檔案內容的格式

-
2.通過查看檔案內容我們發現,檔案每行是以’:‘為分割符的,所以我們需要使用-F引數指定以”:“來對每一行進行切片
awk -F : '/root/ {print $0}' /etc/passwd 注意:$0表示每行切片后的整條記錄,$1表示切片后的第一段內容

2.列印/etc/passwd檔案中的包含’root‘關鍵字的所以記錄的shell內容
-
1.通過查看檔案內容,我們知道記錄中的shell內容對應每行切片后的第七段內容

-
2.我們可以通過列印$7來實作只顯示shell內容
-
awk -F : '/root/ {print $7}' /etc/passwd
3.列印/etc/passwd檔案的第二行的所有內容
-
1.使用引數NR來匹配需要的行數
-
awk -F : 'NR==2 {print $0}' /etc/passwd
4.使用begin加入標題,并且列印所有記錄的第一,第二片段內容
-
awk -F : 'BEGIN{print "start"} {print $1,$2}' /etc/passwd
5.使用awk進行分段匹配
awk -F : '$9~/root/ {print $0}'------匹配第九段內容含root的記錄
6.awk列印倒數第一,倒數第二列欄位
```
cat nginx.log | awk '{print $(NF),$(NF-1)}'
# $(NF)表示倒數第一行,$(NF-1)表示倒數第二行
```
7.awk詞典進行分類匯總

```
cat test.txt | awk '{d[$1]+=$2} END{for(k in d) print k,d[k]}'
# d[$1]在這里分別對應d[a],d[b]
```
結果如下:

4.Linux三劍客實戰
(1)實戰1:查找nginx.log日志檔案中,404和500的報錯的資訊,以及報錯的總行數
- 分析查看nginx.log日志檔案內容,我們發現每條記錄的狀態碼格式為數字且前后都有空格,狀態碼的位置按照空格作為域分隔符,位于第9段,

-
使用grep命令來實作
-
方法一: (1)查看404和500的報錯資訊 grep -E '\s404\s|\s500\s' nginx.log 引數決議: -E:因為grep不支持擴展正則,這里要使用帶’或‘的正則運算式,所以必須加上-E引數 (2)統計404和500報錯資訊的總記錄數 grep -E '\s404\s|\s500\s' nginx.log | wc -l 引數決議: wc -l : 用戶輸出查找到的記錄總數 方法二: (1)查看404和500的報錯資訊 cat nginx.log | grep -E '\s404\s|\s500\s' (2)統計404和500報錯資訊的總記錄數 cat nginx.log | grep -E '\s404\s|\s500\s' | wc -l
-
-
所以awk命令實作
-
方法一: (1)查看404和500的報錯資訊 awk '/\s404\s|\s500\s/ {print$0}' nginx.log 決議: 因為awk默認就是以空格作為域分隔符,所以不需要指定-F引數 (2)統計404和500報錯資訊的總記錄數 awk '/\s404\s|\s500\s/ {print$0}' nginx.log | wc -l 方法二: (1)查看404和500的報錯資訊 cat nginx.log | awk '$9~/404|500/ {print$0}' 引數決議: $9~/404|500/ : 表示使用第九列的內容去匹配后面的正則運算式 (2)統計404和500報錯資訊的總記錄數 cat nginx.log | awk '$9~/404|500/ {print$0}' | wc -l
-
(2)實戰2:找出日志中出現次數最多的前三個ip
- 分析查看nginx.log日志檔案內容,我們發現ip地址的位置為每條記錄的開頭

-
實作步驟一:使用awk單獨提取出ip地址
-
awk '{print$1}' nginx.log
-
-
實作步驟二:進行排序
-
awk '{print$1}' nginx.log | sort 引數決議: sort : 排序
-
-
實作步驟三:相同的ip地址合并
-
awk '{print$1}' nginx.log | sort | uniq -c 引數決議: uniq : 將相同的記錄合并,加上引數’-c‘可以顯示出合并前該內容出現的次數
-

-
實作步驟四:在進行一次排序,
-
awk '{print$1}' nginx.log | sort | uniq -c | sort -nr 引數決議: sort -nr : sort排序默認是字典序且默認為升序,加上引數’-n‘表示按照數字大小排序,加上引數’-r‘表示按照降序排列
-
-
實作步驟四:取前三條記錄
-
awk '{print$1}' nginx.log | sort | uniq -c | sort -nr | head -3 引數決議: head -3 : 表示取出前三條資料 也可以使用命令: awk '{print$1}' nginx.log | sort | uniq -c | sort -nr | awk 'NR<=3 {print$0}'
-
(3)實戰3:全域替換
將nginx.log日志檔案中的’/topics/‘后面的數字替換為number字串
- 分析查看nginx.log日志檔案內容,我們發現/topics/后面的內容是變化的數字

-
使用sed實作全域替換
-
sed -e 's#/topics/[0-9]*#/topics/number#g' nginx.log 引數決議: # : 在sed中用于分隔替換前后字符的標識不一定是’/‘,也可以是其他符號,這里使用#
-
(4)實戰4:ip橫排
我們如果用awk提取的ip地址,是沒有在同一行的,如果我們要實作把所有的ip地址放在同一行怎么實作呢?
-
我們知道,換行是因為末尾有一個換行符,那么我們把換行符換位其他字符是否就可以了呢
-
awk '{print$1}' nginx.log | sed 's/\n/ /g' 結果并沒有變為一行,因為sed在處理每一行時,并沒有讀取到換行符
-
-
優化代碼,在sed中加入N引數,將后面一行內容追加到前一行中
-
awk '{print$1}' nginx.log | sed 'N;s/\n/ /g' 結果:只是把兩行內容合并了,因為每一行中,追加操作只執行了一次
-
-
再次優化代碼:
-
awk '{print$1}' nginx.log | sed ':2;N;s/\n/ /g;t2' 結果成功了, 決議: :2 ---表示創建一個標記2(可以是其他數字) t2 ---表示跳轉到標記2
-

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294905.html
標籤:其他
