用 awk + grep + sed 搞定日志處理神器組合拳
今天分享一下三劍客:grep,sed,awk。
一、Linux三劍客簡介
Linux三劍客指的是grep、sed和awk這三個強大的文本處理工具。
grep偏向于文本搜索,sed專注于文本編輯操作,awk則提供更精細的過濾處理功能。
它們各自具有獨特的功能和優勢,能夠滿足不同的文本處理需求。掌握這些工具的使用,可以極大提高工作和學習的效率。
二、grep:搜索之劍詳解
1. grep簡介
grep 是一個強大的命令行工具,用于在文本文件中搜索指定的模式。它能使用特定模式匹配(包括正則表達式)搜索文本,并默認輸出匹配行。
需要注意的是,grep會將匹配到的整行輸出,而awk可以指定某一行某一列進行輸出。
主要應用場景有:日志分析和文本處理,grep可以從日志文件中找出錯誤信息或特定事件,也用于從大量文本文件中提取特定信息
2. 工作原理
grep進行文本搜索時主要進行以下三步:
- 輸入處理:grep 從指定的文件或標準輸入中逐行讀取數據,檢查每行是否與用戶提供的模式匹配。
- 模式匹配:grep 采用正則表達式進行模式匹配,根據規則檢查每一行是否符合條件。
- 輸出結果:當某行匹配成功時,grep 會將該行輸出
3. 語法和可選項
(1) 基本語法
grep [options] pattern [file...]
- options:可選參數,用來控制搜索的方式、輸出格式等,下面會進行詳細講解
- pattern:必填項,是要搜索的模式或正則表達式,用于匹配文件中的內容
- file: 是要搜索的文件名或目錄,可以是多個
(2) 可選項參數
選項 | 描述 |
-E | 使用擴展正則表達式,grep -E 等同于egrep |
-i | 忽略大小寫 |
-r | 遞歸搜索某個目錄下所有文件 |
-v | 反向匹配,輸出不匹配的行 |
-n | 顯示行號 |
-c | 顯示匹配行的總數,而不是打印匹配行。 |
-A n | 輸出匹配的后n行 |
-B n | 輸出匹配的前n行 |
-C n | 打印匹配前后的n行 |
-L | 列出未包含匹配項的文件名 |
-o | 只顯示匹配到的字符串本身,而不是整個行 |
-w | 精確匹配整詞,防止匹配到包含該單詞的部分詞匯 |
4. 實戰操作
(1)-i選項:忽略大小寫
# 打印處日志文件中所有包含error字符的,不論大小寫
grep -i error /var/log/message
(2)-r選項:遞歸查詢
# 輸出/etc/nginx/conf.d目錄所有關于www字符的行,常用查找域名或端口信息
grep -ir /etc/nginx/conf.d
(3)-E選項:支持擴展正則表達式 (4)-v選項:反向匹配
# 過濾某個文件的所有空行和帶#號注釋的行
grep -Ev '^#|^$' /etc/nginx.conf
(4)-n選項:顯示行號
# 找出包含root和ssh字符的行號
grep -En 'root|ssh' /etc/passwd
(5)-l選項:查找文件名
# 查找文件包含root字符的文件名
grep -l root *
(6)-A選項:查找后面幾個字符
(7)-B選線:查找前面幾個字符
(8)-C選擇:查找前后幾個字符
# 查找有錯誤的后面3行信息
grep -iA 3 error /var/log/messages
# 查找有錯誤的前面3行信息
grep -iB 3 error /var/log/messages
# 查找有錯誤的上下3行信息
grep -iC 3 error /var/log/messages
三、sed:編輯之劍詳解
1. sed簡介
sed是編輯之劍:一個流編輯器,它允許用戶在文件中進行文本替換、刪除、添加等操作。sed支持基礎和擴展的正則表達式,并提供了豐富的文本處理功能,如替換命令、地址定界等。sed的強大之處在于它可以非交互式地編輯文件或標準輸入,使其成為自動化文本處理的理想選擇。
應用場景有:批量替換,文本處理,通過sed命令可以快速替換文件中的特定字符串,如配置文件的修改;在shell腳本中結合其他命令如grep、awk等,實現復雜的文本處理任務
2. 工作原理
sed的工作流程包括讀取、執行和顯示三個主要過程。
它會從輸入流中讀取一行內容并存儲到臨時緩沖區(模式空間),然后根據設定的命令在模式空間中執行編輯操作,最后將處理后的內容輸出到標準輸出
3. 語法、選項和動作介紹
(1)基本語法
sed [option] 'sed command' file
(2)常用選項
選項 | 描述 |
-n | 只打印匹配處理的行,不修改文件 |
-e | 允許多個編輯命令同時執行 |
-f | 從腳本文件中讀取并執行sed命令 |
-i | 直接修改文件內容 |
-r | 支持擴展正則表達式 |
(3)常用動作
動作 | 描述 |
p | 打印模式空間的內容 |
a | 在當前行后追加內容 |
i | 在當前行前插入內容 |
c | 用新文本替換模式空間中的內容 |
d | 刪除模式空間中的內容 |
s | 替換內容 |
4. 實戰操作
sed可以做增刪改查操作,接下來分別演示。
復制/etc/passwd文件到/opt下,以/opt/passwd來做測試操作
cp /etc/passwd /opt/passwd
(1)增加操作
主要有兩個動作指令:a是追加內容到指定行后面,i是插入內容到指定行前面
# 在第2行后面追加內容
# 注意:這樣只是打印出來,并沒有修改文件里面的內容,如果要修改,需加-i參數
sed '1a 123' /opt/passwd
# 在第一行前面插入內容,加-i后文件真實改變
sed -i '1i 456' /opt/passwd
# 在最后一行后面追加內容
sed '$a 789' /opt/passwd
(2)刪除操作
# 刪除第一行
sed '1d' /opt/passwd
# 刪除2-4行
sed '2,4d' /opt/passwd
# 將匹配的行進行刪除
sed '/\/bin\/bash/d' /opt/passwd
# 刪除以root開頭的行
sed '/^root/d' /opt/passwd
# 刪除文中的空行和注釋
sed -e '/^#/d' -e '/^$/d' /opt/passwd
(3)更改操作
s是用于替換操作的,日常中最為常用,配合g使用,可以替換全部匹配到的內容
# 替換常用模板,也可以將#改為/
sed -i 's#目標內容#替換內容#g' file
# 常用于修改selinux的命令
sed -i 'sy#=enforcing#=disabled#g' /etc/selinux/config
# 將nologin替換成login
sed 's/nologin/login/g' /opt/passwd
# 以mail開頭的行,將該行所有的mail替換為gmail
sed '/^mail/{s#mail#gmail#g}' /opt/passwd
(4)查找操作
# 只打印第三行內容
sed -n '3p' /opt/passwd
四、awk:過濾之劍
1. awk簡介
awk是一個編程語言工具,主要用于處理數據和生成報告。它能夠按行和列分析文本文件,并對符合條件的數據執行操作,數據可以來自標準輸入也可以是管道或文件。awk特別適合于處理結構化的文本數據,如日志文件、CSV文件等
2. 工作原理
awk的工作原理可以分為三個主要部分:BEGIN塊、主循環體和END塊。
BEGIN塊中的代碼在處理任何輸入行之前執行,且只執行一次。它通常用于初始化變量或打印表頭信息;
主循環體是awk的核心部分,逐行讀取輸入文件并對每行進行處理。它會按指定的分隔符(默認為空格或制表符)將每行分割成字段,并存入內建變量中;
END塊中的代碼在所有輸入行處理完畢后執行,且只執行一次。常用于輸出最終結果或總結信息
注意:在使用awk時不一定要每個部分都出現,根據實際處理需求來使用哪個部分。
具體的工作流程分為以下三步:
- 讀(Read):從文件、管道或標準輸入中讀入一行然后把它存放到內存中
- 執行(Execute):對每一行數據,根據 AWK 命令按順序執行。默認情況是處理每一行數據,也可以指定模式
- 重復(Repeat):一直重復上述兩個過程直到文件結束
3. 語法參數
(1)基礎語法 awk指令是由模式,動作,或者模式和動作的組合組成。
awk [options] 'pattern {action}' file
(2)可選項
選項 | 描述 |
-F <分隔符> | 用于指定輸入字段的分隔符,默認是空格,可以使用逗號,冒號等 |
-v <變量名>=<值> | 用于定義一個變量并賦值 |
-f <腳本文件> | 用于從指定的腳本文件中讀取awk命令,適用于awk指令較復雜場景 |
-r <擴展正則表達式> | 用于啟用擴展正則表達式模式匹配功能 |
-s | 用于禁用自動換行功能,使得awk在輸出時不會自動換行 |
-c <命令> | 用于執行單個awk命令而不是從文件讀取 |
(3)內置變量
變量 | 描述 |
NF | 表示當前記錄的字段數量 |
NR | 表示已讀的記錄數(即行號) |
FS | 表示輸入字段分隔符,默認為空格或制表符 |
OFS | 表示輸出字段分隔符 |
RS | 表示輸入記錄分隔符,默認為換行符 |
$0 | 當前處理的行的整行內容 |
$n | 當前處理行的第n個字段(第n列) |
4. 實戰操作
awk操作也是用/opt/passwd文件演示
(1)輸出全文內容并附帶行號
awk '{print NR,$0}' /opt/passwd
(2)只打印第五行
awk 'NR==2{print}'
(3)以: 為分隔符,打印第一列
awk -F ":" '{print $1}' /opt/passwd
(4)以: 為分隔符,打印第2列和最后一列
awk -F ":" '{print $2,$NF}' /opt/passwd
(5)打印以:和/ 為分隔符且包含root的行的列數
awk -F ":/" '/root/{print NF}' /opt/passwd
(6)打印以:為分隔符包含root的行數和整行內容
awk -F ":/" '/root/{print NR,$0}' /opt/passwd
(7)格式化定制
[root@localhost ~]# awk -F ":" '{print "第"NR"行有"NF"列"}' /opt/passwd
第1行有1列
第2行有7列
第3行有7列
第4行有7列
生產環境BEGIN和END部分并不怎么常用,就不展開舉例了
五、總結
Linux三劍客是任何Linux用戶或系統管理員必須掌握的工具。無論是簡單的文本搜索、數據提取還是復雜的文本處理任務,這些工具都能提供強大的支持。