了解三劍客
三劍客指的是: grep、sed和awk這三個在linux系統中常用的命令行工具
shell三劍客
grep: 主要用于查找和過濾特定文本
sed:是一個流編輯器,可以對文本進行增刪改查
awk:是一個文本處理工具,適合對列進行處理和分析。它不僅可以進行查找和替換,還能執行數學計算和數據統計
shell三劍客試用場景
1.日志處理與搜索:使用grep 搜索關鍵詞,結合sed和awk進行進一步處理和分析
2.配置文件管理: 使用sed和awk進行批量修改、添加、或刪除配置項。
3.數據提取和轉換:利用awk提取、分析和轉換結構化文本數據,處理CSV、JSON等格式
4.監控與報警:使用grep、sed和awk提取關鍵信息生成監控報告,監控系統狀態和性能
5.日常運維任務:自動化任務如查找過期文件、清理日志、統計日志大小等。
6.系統管理:使用sed和awk處理系統狀態信息,如用戶信息、進程信息、磁盤使用情況等。
shell三劍客之grep指令
基本語法:grep 選項 內容 文件
記住:都是常見一些選項
支持的正則 | 描述 |
---|---|
-E,--extended-regexp | 模式是擴展正則表達式(ERE) => 字符簇、()、|或 |
-P,--perl-regexp | 模式是Perl正則表達式 => \d、\w、\s |
-i,--ignore-case | 忽略大小寫 |
-w,--word-regexp | 模式匹配整個單詞 |
-v,--invert-match | 打印不匹配的行(取反) |
了解:能記住最好,記不住,作為了解,使用的時候查看文檔!
輸出控制 | 描述 |
---|---|
-n,--line-number | 打印行號 |
-o,--only-matching | 只打印匹配的內容 |
-r,--recursive | 遞歸目錄 |
-c,--count | 統計匹配行數 |
練習
準備數據集
# vim demo.txt
Hello, this is an example file.
It contains some lines of text.
Let's use grep to search for specific patterns.
在文件中搜索包含單詞 "example" 的行
grep "example" demo.txt
shell三劍客之sed指令
語法格式:sed? 【選項】 ?? 【sed命令】 ? ? 【輸入文件】?
說明:
① 注意sed軟件以及后面選項,sed命令和輸入文件,每個元素之間都至少有一個空格。
② 為了避免混淆,筆記中稱呼sed為sed軟件。sed -commands(sed命令)是sed軟件內置的一些命令選項,為了和前面的options(選項)區分,故稱為sed命令
③ sed -commands 既可以是單個sed命令,也可以是多個sed命令組合。
④ input -file (輸入文件)是可選項,sed還能夠從標準輸入如管道獲取輸入。
sed軟件有兩個內置的存儲空間:
☆ 模式空間(pattern space):是sed軟件從文本讀取一行文本然后存入的緩沖區(這個緩沖區是在內存中的),然后使用sed命令操作模式空間的內容。
☆ 保持空間(hold space):是sed軟件另外一個緩沖區,用來存放臨時數據,也是在內存中,但是模式空間和保持空間的用途是不一樣的。sed可以交換保持空間和模式空間的數據(一般都是將保持空間的數據,拿到模式空間進行操作),但是不能在保持空間上執行普通的sed命令,也就是說我們可以在保持空間存儲數據。
模式空間:臨時存放數據,然后通過sed命令進行加工處理,處理完成后,打印到屏幕,然后清空模式空間
保持空間:存儲數據(以后我們操作一行文本的時候,真的所有的時候都只能一行一行操作嗎?答:有的時候會對多行內容進行操作,當然你對內容進行多行操作的時候,就可以把數據放在 保持空間)
sed選項說明
記住常用的三個選項:
option[選項] | 解釋說明(帶*的為重點) |
---|---|
-n | 取消默認的sed軟件的輸出,常與sed命令的p連用* |
-r | 使用擴展正則表達式(grep -E),默認情況sed只識別基本正則表達式* |
-i | 直接修改文件內容,而不是輸出到終端,如果不使用-i選項sed軟件只是修改在內存(模式空間)中的數據,并不會影響磁盤上的文件* |
記住幾個常用:
sed -commands | 解釋說明(帶*的為重點) |
---|---|
a | append追加,在指定行后添加一行或多行文本* |
c | change,取代指定的行 |
d | delete,刪除指定的行* |
i | insert插入,在指定行前添加一行或多行文本* |
p | print,打印模式空間內容,通常p會與選項-n一起使用* |
q | 退出sed |
r | 從指定文件讀取數據 |
s | 取代,s#old#new#g==>這里g是s命令的替代標志,注意和g命令區分。* |
重點記住:增刪改查操作 => 增加a、刪除d、修改c或s、查詢p
sed添加操作
# cat >person.txt<<EOF
101,Tom,CEO
102,Rose,CTO
103,Alex,COO
104,Jack,CFO
105,Jennifer,CIO
EOF
?
命令說明:使用一條cat命令創建多行文本,文件包含上面的內容,后面的操作都會使用這個文件。
單行操作
sed '2a 106,Smith,CSO' person.txt
注:
2代表指定對第2行操作,其他的行忽略;
a代表追加的意思,2a即在第2行后追加文本;
2a后面加上空格,然后跟上你想要插入的多行文本即可。這里的每行文本使用"\n"連接就可以寫成一行了。
注意:以上2a也可以調整為2i,代表在第2行的前面添加一行
多行操作
sed '2a 106,Eric,CSO\n107,Susan,CCO' person.txt
注:\n代表換行符
sed默認操作文件內容是在內存中的模式空間中進行實現,不會影響原文件內容。
增加操作有兩種方式(行號 + i,指定行前面添加內容),(行號 + a,指定行后面添加內容)
如果希望增加操作影響原文件,可以添加一個選項-i
sed刪除操作(記住d)
刪除指定行文本。
注意:建議刪除的時候 使用 單引號
案例1:下面用具體的例子演示一下sed刪除操作實現
# sed 'd' person.txt
命令說明:如果在sed命令前面不指定地址范圍,那么默認會匹配所有行,然后使用d命令刪除功能就會刪除這個文件的所有內容
案例2:
# sed '2d' person.txt
命令說明:這個單行刪除想必大家能理解,指定刪除第2行的文本
案例3:
# sed '2,5d' person.txt
命令說明:'2,5d' 指定刪除第2行到第5行的內容,d代表刪除操作。
案例4:
sed '/Jack/d' person.txt
命令說明:在sed軟件中,使用正則的格式和awk一樣,使用2個"/"包含指定的正則表達式,即"/正則表達式/"。
案例5:
# sed '/Tom/,/Alex/d' person.txt
命令說明:這是正則表達式形式的多行刪除,也是以逗號分隔2個地址,最后結果是刪除包含"Tom"的行到包含"Alex"的行
案例6:
# sed '3,$d' person.txt
命令說明:學過正則表達式后我們知道"$"代表行尾,但是在sed中就有一些變化了,"$"在sed中代表文件的最后一行。因此本例子的含義是刪除第3行到最后一行的文本,包含第3行和最后一行,因此剩下第1,2行的內容。
案例7:在最后一行,追加 內容
# sed '$a 106,Tom,CSO' person.txt
命令說明:為了不造成同學們實驗文本改來改去導致不同意,因此我用上面的命令語句只是臨時修改內存數據,然后通過管道符號傳給sed軟件。
小結:
sed軟件不僅可以添加數據行,也可以刪除數據行,刪除數據行必須使用(d)命令
sed刪除軟件 => (sed '范圍d' 文件)=> 默認都是在內存中完成,需要影響原文件,則添加一個-i
sed匹配原則,匹配內容 + d,如3,5d :刪除從第三行-第五行的內容
sed修改操作(重點,要記住c和s)
c:change縮寫,替換指定行,以行為單位
s : s/舊的內容/替換后內容/g 或 s#舊的內容#替換后內容#g,以關鍵詞為單位
注意:不建議使用 /,建議使用 #,因為,/ 容易 混淆,比如說,我的內容中就有 /,如果要替換了,那是不是要加,轉移字符\/
為什么使用#作為標識符,因為如果文件路徑的替換,/root、/etc,剛好與邊界符號沖突了
sed修改操作,我們最常見的操作就是改配置文件,改參數等等 首先說一下按行替換,這個功能用的很少,所以大家了解即可。這里用到的sed命令是:"c":用新行取代舊行,記憶方法:c的全拼是change,意思是替換。
sed查詢操作(記住-n+p)
sed命令:
"p":輸出指定內容,但默認會輸出2次匹配的結果,因此使用-n選項取消默認輸出,記憶方法:p的全拼是print,意思是打印。
Shell三劍客之awk指令
awk格式
awk指令是由模式,動作,或者模式和動作的組合組成。
可以理解為:我們的模式和動作選項中,可以 只有模式(意味著,你要所有的內容),也可以只有動作,也可以有 模式+動作
模式既pattern,可以類似理解成sed的模式匹配,可以由表達式組成,也可以是兩個正斜杠之間的正則表達式。比如NR==1,這就是模式,可以把他理解為一個條件。
動作即action,是由在大括號里面的一條或多條語句組成,語句之間使用分號隔開。
options既參數,使用最多的參數為-F(Field,用于指定字段與字段之間的分隔符,列與列之間的分隔符,默認為空格)
pattern既模式,也可以理解為條件,也叫找誰,你找誰?高矮,胖瘦,男女?都是條件,既模式。
action既動作,可以理解為干啥,找到人之后你要做什么。
注意:awk -F"分隔符" '模式和動作' file
-F后面跟是雙引號,模式和動作要使用單引號進行包裹!!!
基本模式與動作
# awk -F ":" 'NR>=2 && NR<=6{print NR,$1}' /etc/passwd
2 bin
3 daemon
4 adm
5 lp
6 sync
?
命令說明:
-F 指定分隔符為冒號,相當于以“:”為菜刀,進行字段的切割。
NR>=2 && NR<=6:這部分表示模式,是一個條件,表示取第2行到第6行。
{print NR,$1}:這部分表示動作,表示要輸出NR行號和$1第一列。
$1代表第1列
$2代表第2列
依次類推
NR == Number(數字、號碼)+ Record(記錄、行)== 行號
awk執行過程
解析:
① awk讀入第一行內容
② 判斷是否符合模式中的條件NR>=2
如果匹配則執行對應的動作{print $0}
如果不匹配條件,繼續讀取下一行
③ 繼續讀取下一行
④ 重復過程1-3,直到讀取到最后一行(EOF:end of file)
awk記錄(行)
名稱 | 含義 |
---|---|
record | 記錄,行 => NR(Number Record)行號 |
field | 域,區域,字段,列 => NF(Number Field)列號,$NF代表最后一列 |
awk默認情況下每一行都是一個記錄(record)
① RS既record separator輸入輸出數據記錄分隔符,每一行是怎么沒的,表示每個記錄輸入的時候的分隔符,既行與行之間如何分隔,默認為\n,可以調整為其他字符。
② NR既number of record 記錄(行)號,表示當前正在處理的記錄(行)的號碼。
③ ORS既output record separator 輸出記錄分隔符。
awk使用內置變量RS來存放輸入記錄(行與行)分隔符,RS表示的是輸入的記錄分隔符,這個值可以通過BEGIN模塊重新定義修改。
NR:行號,打印行號
NF:NF代表列號,如果前面添加了$,則代表最后一列
$0:整行內容
awk字段(列)
每條記錄都是由多個區域(field)組成的,默認情況下區域之間的分隔符是由空格(即空格或制表符)來分隔,并且將分隔符記錄在內置變量FS中,每行記錄的區域數保存在awk的內置變量NF中。
awk分隔符
如果采用默認分隔符,切割內容,如果左邊有一大批空白內容,則默認分隔符會自動忽略此內容。
如果采用人為設定分隔符,切割內容,如果左邊有一大批空白內容,則人為設定的分隔符會對這塊內容進行切割。
awk模式與動作進階
awk模式與動作
接下來就詳細介紹下,awk的模式都有幾種:
☆ 正則表達式作為模式
☆ 比較表達式作為模式 NR>=2
☆ 范圍模式 NR>=2 && NR <= 5
☆ 特殊模式BEGIN和END
BEGIN模式與END模式
BEGIN模塊在awk讀取文件之前就執行,一般用來定義我們的內置變量(預定義變量,eg:FS,RS),可以輸出表頭(類似excel表格名稱)
BEGIN模式之前我們有在示例中提到,自定義變量,給內容變量賦值等,都使用過。需要注意的是BEGIN模式后面要接跟一個action操作塊,包含在大括號內。awk必須在輸入文件進行任何處理前先執行BEGIN里的動作(action)。我們可以不要任何輸入文件,就可以對BEGIN模塊進行測試,因為awk需要先執行完BEGIN模式,才對輸入文件做處理。BEGIN模式常常被用來修改內置變量ORS,RS,FS,OFS等值
數據集:
# cat /server/files/awkfile.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
BEGIN模塊完整寫法:BEGIN{}
# awk -F: 'BEGIN{print "username","UID"}{print $1,$3}' awkfile.txt
username UID ?#這就是輸出的表頭信息
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
uucp 10
☆ END模式
作用:與BEGIN相呼應,在awk處理文件結束后,會自動觸發END模塊(只會觸發1次)
基本語法:
awk '動作 END{print xxx}'
應用場景說明: awk執行結束,用于實現收尾操作 ① 數學計算中,輸出最終結果 ② 輸出最后一行等等