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