您好,登錄后才能下訂單哦!
博文大綱:
一、正則表達式
(1)正則表達式的定義
(2)正則表達式用途
1.基礎正則表達式
(1)grep命令工具
2.擴展正則表達式
二、文本編輯處理器
1.grep命令工具
2.sed命令工具
3.awk命令工具
正則表達式又稱正規表達式、常規表達式。在代碼中常簡寫為regex、regexp或RE。正則表達式是使用單個字符串來描述,匹配一系列符合某個句法規則的字符串。簡單的說,正則表達式是一種匹配字符串的方法,通過一些特殊符號,實現快速查找、刪除、替換某個特定字符串。
正則表達式是由普通字符與元字符組成的文字模式。該模式用于描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與搜索的字符串進行匹配。其中,普通字符包括大小寫字母、數字、標點符號及一些其他符號,元字符則是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式。
正則表達式一般用于腳本編程與文本編輯器。很多文本處理器與程序設計語言均支持正則表達式。比如,LInux系統經常用到的文本處理器(grep、egrep、sed、awk),正則表達式具備很強大的文本匹配功能,能夠在文本海洋中快速高效地處理文本。
正則表達式對于系統管理員來說是非常重要的,系統運行過程中會產生大量的信息,這些信息中有些是非常重要的,有些僅僅是警告的信息。身為系統管理員如果直接查看這么多的信息數據,無法快速定位到非常重要的信息。如“用戶賬號登錄失敗”、“服務啟動失敗”等重要信息。這是便可以通過正則表達式快速提取有問題的信息,如此一來,可以將運維工作變得更加簡單、方便。
系統語系對正則表達式的影響是非常大的!
zh_TW.big5 及 C 這兩種語系的輸出結果分別如下:
LANG=C 時:0 1 2 3 4 ... A B C D ... Z a b c d ...z
LANG=zh_TW 時:0 1 2 3 4 ... a A b B c C d D ... z Z
為了要避免這樣編碼所造成的英文與數字的截取問題,因此有些特殊的符號我們得要了解一下的!如圖:
目前很多軟件也支持正則表達式。在Internet中,垃圾廣告、郵件等將會造成網絡塞車,如果在服務器端就將這些問題提前剔除的話,客戶端就會減少很多不必要的帶寬消耗。
作為Linux系統管理員來說,掌握正則表達式是必備的條件之一。
正則表達式的字符串表達方式根據不同的嚴謹程度分為基本正則表達式與擴展正則表達式。基礎正則表達式是常用的正則表達式的最基礎的部分。在Linux系統中常見的文件處理工具中grep和sed支持正則表達式,而egrep與awk支持擴展正則式。掌握基礎正則表達式的使用方法,首先必須了解基本正則表達式所包含的元字符的含義。
[root@localhost ~]# grep -n 'the' test.txt
//查找包含the的行
[root@localhost ~]# grep -vn 'the' test.txt
//查找不包含the的行
[root@localhost ~]# grep -in 'the' test.txt
//查找包含the的行,而且不區分大小寫
[root@localhost ~]# grep -n 'sh[io]rt' test.txt
//查找以sh開頭,以rt結尾,中間是i或o的字符
[root@localhost ~]# grep -n '[^w]oo' test.txt
//查詢oo前面不是w的字符串
[root@localhost ~]# grep -n '[^a-z]oo' test.txt
//查詢oo前面不是小寫字母的字符串
[root@localhost ~]# grep -n '^the' test.txt
//查詢以the開頭的字符串(^表示開頭)
[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt
//查詢不以字母開頭的字符串([^]則表示反向的意思)
[root@localhost ~]# grep -n '\.$' a.txt
//查詢以“.”結尾的字符串
//$表示行尾的意思,因為“.”是特殊元字符,所以需要使用“\”跳脫字符將其轉為普通字符
[root@localhost ~]# grep -n 'w..d' test.txt
//查詢w與d之間包含兩個字符的行(“.”匹配任意一個字符)
[root@localhost ~]# grep -n 'ooo*' test.txt
//查找至少包含兩個o的字符串,“*”表示的是重復零個或多個前面的單字符
[root@localhost ~]# grep -n 'woo*d' test.txt
//查詢以w開頭,以d結尾中間至少包含一個o的行
[root@localhost ~]# grep -n 'w.*d' test.txt
查詢以w開頭d結尾,中間的字符可有可無的行(“.”表示任意)
[root@localhost ~]# grep -n 'o\{2\}' test.txt
//{n}匹配確定的n次。查詢包含兩個o的行(“{}”是特殊字符需要用“\”轉義)
[root@localhost ~]# grep -n 'wo\{2,5\}' test.txt
//查詢以w開頭d結尾,中間包含2~5個o的行({n,m}最少匹配n次且最多m次)
[root@localhost ~]# grep -n 'wo\{2,\}' test.txt
查詢以w開頭以d結尾,中間包含2個以上o的行({n,}至少匹配n次)
通常情況下會使用基礎正則表達式就已經足夠了,但是為了簡化整個指令,需要使用范圍更廣的擴展正則表達式。
在Linux系統常見的文本處理工具中egrep與awk支持擴展正則表達式,egrep命令與grep命令的用法基本相似。
在基礎正則表達式中已經提到,這里就不詳細介紹了!
sed是一個強大而簡單的文本解析轉換工具,可以讀取文本,并根據指定的條件對文本內容進行編輯,最后輸出所有行活僅輸出處理的某些行,sed可以在無交互的情況下實現相當復雜的文本處理操作。被廣泛的應用于shell腳本中,用于完成各種自動化處理任務。
sed的工作流程主要包括:
- 讀取:sed從輸入流中讀取一行內容不能夠存儲到臨時的緩沖區中;
- 執行:默認情況下所有的sed命令都在模式空間中按順序地執行,除非指定了行的地址,否則sed命令將會再所有行上依次執行;
- 顯示:發送修改后的內容到輸出流,再發送數據后,模式空間將會被清空。
注意:在所有的文件內容都被處理完成之前,上述過程將重復執行,直至所有內容都被處理完。
常見的sed命令選項常見的參數,如圖:
如果要求在第幾行到第幾行之間進行修改等,常見的操作參數包括:
注意以下操作不會改變文件本身內容,如果需要修改必須帶“-i”選項
[root@localhost ~]# sed -n 'p' test.txt
//輸出所有內容,等同于“cat test.txt”
[root@localhost ~]# sed -n '3p' test.txt
//輸出第三行內容
[root@localhost ~]# sed -n '3,5p' test.txt
//輸出3~5行
[root@localhost ~]# sed -n 'p;n' test.txt
//輸出所有奇數行,n表示讀入下一行數據
[root@localhost ~]# sed -n 'n;p' test.txt
//輸出所有偶數行,n表示讀入下一行數據
[root@localhost ~]# sed -n '1,5{p;n}' test.txt
//輸出第1行~第5行之間的奇數行(第1、3、5行)
[root@localhost ~]# sed -n '10,${n;p}' test.txt
//輸出第10行至文件尾部之間的偶數行(包括空行)
sed命令與正則表達式結合使用的案例
sed命令結合正則表達式時,格式略微有些不同,正則表達式以“/”包圍。
[root@localhost ~]# sed -n '/the/p' test.txt
//輸出包含“the”的行
[root@localhost ~]# sed -n '4,/the/p' test.txt
//輸出從第4行到都第一個包含“the”的行
[root@localhost ~]# sed -n '/the/=' test.txt
//輸出包含“the”的行所在的行號(等號(=)用來輸出行號)
[root@localhost ~]# sed -n '/^PI/p' test.txt
//輸出以“PI”開頭的行
[root@localhost ~]# sed -n '/\<wood\>/p' test.txt
//輸出包含單詞wood的行,\<、\>代表單詞邊界
nl命令用于計算文件的行數
[root@localhost ~]# nl test.txt | sed '3d'
//刪除第3行
[root@localhost ~]# nl test.txt | sed '3,5d'
//刪除第3~5行
[root@localhost ~]# nl test.txt | sed '/cross/d'
//刪除包含cross的行,原本的第8行被刪除
[root@localhost ~]# nl test.txt | sed '/cross/! d'
//刪除不包含cross的行
[root@localhost ~]# sed '/\.$/d' test.txt
//刪除以“.”結束的行
[root@localhost ~]# sed '/^$/d' test.txt
//刪除所有空行
[root@localhost ~]# sed -e '/^$/{n;/^$/d}' test.txt
//刪除空行,連續的空行留一個
使用sed命令進行替換操作時需要用到的選項:s(字符串替換)、c(整行/整塊替換)、y(字符轉換)等命令選項。
[root@localhost ~]# sed 's/the/THE/' test.txt
//將每行中的第一個the替換為THE
[root@localhost ~]# sed 's/l/L/2' test.txt
//將每行中的第三個“l”替換為“L”
[root@localhost ~]# sed 's/the/THE/g' test.txt
//將文件中所有的“the”替換為“THE”
[root@localhost ~]# sed 's/o//g' test.txt
//將文件中所有的“o”刪除
[root@localhost ~]# sed 's/^/#/' test.txt
//在每行的行首插入“#”號
[root@localhost ~]# sed '/the/s/^/#/' test.txt
//在包含“the”的每行行首插入“#”號
[root@localhost ~]# sed 's/$/EOF/' test.txt
//在每行行尾插入字符串“EOF”
[root@localhost ~]# sed '3,5s/the/THE/g' test.txt
//將第3~5行中的所有“the”替換為“THE”
[root@localhost ~]# sed '/the/s/o/O/g' test.txt
//將包含“the”的所有行中的o替換為“O”
以上“sed -i”的命令則是直接修改文件內容,立即生效的!
[root@localhost ~]# sed -i '1c 1111' a.txt
//替換文中第一行的內容為“1111”
[root@localhost ~]# sed -i '1a 1111' a.txt
//在第一行后面插入一行內容,內容為“1111”
[root@localhost ~]# sed -i '1i 2222' a.txt
//在第一行前面插入一行內容,內容為“2222”
[root@localhost ~]# sed -i '1d' a.txt
//刪除第一行內容
[root@localhost ~]# sed -n '1p' a.txt
//打印出第一行的內容
[root@localhost ~]# sed -i '1s/2222/3333/g' a.txt
//將文本第一行內容“2222”替換為“3333”
使用sed命令進行遷移文本操作時需要用到的選項有:
- g、G將剪貼板中的數據覆蓋/追加到指定行;
- w保存為文件;
- r讀取指定文件;
- a追加指定內容。
[root@localhost ~]# sed '/the/{H;d};$G' test.txt
//將包含“the”的行遷移到文件末尾,“;”用于多個操作
[root@localhost ~]# sed '1,5{H;d};17G' test.txt
//將第1~5行的內容轉移到第17行后
[root@localhost ~]# sed '/the/w out.file' test.txt
//將包含“the”的行另存為文件out.file
[root@localhost ~]# sed '/the/r /etc/hostname' test.txt
//將文件/etc/hostname的內容添加到包含“the”的每行以后
[root@localhost ~]# sed '3aNEW' test.txt
//在第3行后面插入一個新行,內容為“NEW”
[root@localhost ~]# sed '/the/aNEW' test.txt
//在包含“the”的每行后插入一個新行,內容為“NEW”
[root@localhost ~]# sed '3aNEW1\nNEW2' test.txt
//在第3行后面多行內容,中間的“\n”表示換行
使用sed腳本,將編輯指令存放到文件中(每行一條標記指令),通過“-f”選項來調用。
[root@localhost ~]# sed '1,5{H;d};17G' test.txt
//將第1~5行內容轉移至第17行后
以上操作轉換為腳本文件方式:
[root@localhost ~]# vim 1.list 1,5H 1,5d 17G [root@localhost ~]# sed -f 1.list test.txt
編寫一個腳本,用來調整vsftpd服務配置:禁止匿名用戶,但允許本地用戶(也允許寫入)登錄。
[root@localhost ~]# vim local_only_ftp.sh
#!/bin/bash
S="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INSERNET_SITE/vsftpd.conf"
C="/etc/vsftpd/vsftpd.conf"
#指定樣本文件路徑、配置文件路徑
[ ! -e "$C.bak" ] && cp $C $C.bak
#備份原來的配置文件,檢測(配置文件.bak)是否存在,如果不存在則使用cp命令復制
sed -e '/^anonymous_enable/s/YES/NO/g' $S > $C
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $C
grep "listen" $C || sed -i '$alisten=YES' $A
#基于樣本配置進行調整,覆蓋現有文件
systemctl restart vsftpd
systemctl enable vsftpd
#重啟ftp服務,并設置為開機自啟動
在Linux/UNIX系統中,awk是一個功能強大的編輯工具,逐行讀取輸入文本,并根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,可以在無交互的情況下實現相當復雜的文本操作,被廣泛應用于Shell腳本,完成各種自動化配置任務。
awk執行結果可以通過print的功能將字段數據打印顯示。在使用awk命令的過程中,可以使用邏輯操作符“&&”和“||”;
也可以進行簡單的數學運算,如+ 、-、*、/、%、^分別表示加、減、乘、除、取余、乘方。
awk從輸入文件或者標準輸入中讀入信息,與sed一樣,信息的讀入也是逐行讀取的。不同的是,awk命令將文本文件中的一行視為一個記錄,而將一行中的某一部分(列)作為記錄的一個字段。為了操作這些不同的字段(列),awk借用shell中類似于位置變量的方法,用$1、$2…$9順序的表示不同列,$0表示整行。不同字段與不同字段可以通過指定的方式進行分隔,awk默認的分隔符是空格。awk命令允許使用“-F分隔符”的形式來指定分隔符。
awk命令對/etc/passwd文件的處理過程,如圖:
awk包含幾個特殊的內建變量,如:
[root@localhost ~]# awk '{print}' test.txt
//輸出所有內容,等同于“cat test.txt”
[root@localhost ~]# awk '{print $0}' test.txt
//輸出所有內容,等同于“cat test.txt”
[root@localhost ~]# awk 'NR==1,NR==3{print}' test.txt
//輸出第1~3行的內容
[root@localhost ~]# awk '(NR>=1) && (NR<=3) {print}' test.txt
//輸出第1~3行的內容
[root@localhost ~]# awk 'NR==1 || NR==3{print}' test.txt
//輸出第1行、第3行的內容
[root@localhost ~]# awk '(NR%2)==1 {print}' test.txt
//輸出所有奇數行的內容
[root@localhost ~]# awk '(NR%2)==0 {print}' test.txt
//輸出所有偶數行的內容
[root@localhost ~]# awk '/^root/{print}' /etc/passwd
//輸出以“root”開頭的行
[root@localhost ~]# awk '/nologin$/{print}' /etc/passwd
//輸出以“nologin”結尾的行
[root@localhost ~]# awk 'BEGIN {x=0} ;/\/bin\/bash$/{x++};END {print x}' /etc/passwd
//統計以/bin/bash結尾的行數
[root@localhost ~]# grep -c "/bin/bash$" /etc/passwd
//統計以/bin/bash結尾的行數
[root@localhost ~]# awk 'BEGIN{RS=""}; END{print NR}' /etc/squid/squid.conf
//統計以空格分隔的文件段落數
注意:命令較多時,使用“BEGIN……END”
[root@localhost ~]# awk '{print $3}' test.txt
//輸出每行中(以空格分隔)的第3個字段
[root@localhost ~]# awk '{print $1,$3}' test.txt
//輸出每行中(以空格分隔)的第1個和第3個字段
[root@localhost ~]# awk -F ":" '$2==""{print}' /etc/shadow
//輸出/etc/shadow文件中(以“:”分隔)的第二個字段(密碼為空的用戶)
[root@localhost ~]# awk 'BEGIN {FS=":"}; $2=""{print}' /etc/shadow
//輸出/etc/shadow文件中(以“:”分隔)的第二個字段(密碼為空的用戶)
[root@localhost ~]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwd
//輸出以“:”分隔且第7個字段中包含“/bash”的行的第1個字段
[root@localhost ~]# awk '($1~"nfs") && (NF==8) {print $1,$2}' /etc/services
//輸出包含8個字段且第1個字段中包含“nfs”的行的第1、2個字段
[root@localhost ~]# awk -F ":" '($7!="/bin/bash") && ($7!="/sbin/nologin") {print}' /etc/passwd
//輸出第7個字段既不為“/bin/bash”也不為“/bin/nologin”的所有行
[root@localhost ~]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
//調用“wc -l”命令統計使用“bash”的用戶個數
[root@localhost ~]# grep -c "bash$" /etc/passwd
//同上一條命令一樣的作用
[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'
//調用“w”命令,并用力啊統計在線用戶數
[root@localhost ~]# awk 'BEGIN { "hostname" | getline ; print $0}'
//調用“hostname”命令,并輸出當前用戶名
[root@localhost ~]# awk 'BEGIN{ a=6;b=3;print"(a + b)=",(a + b)}'
(a + b)= 9
[root@localhost ~]# awk 'BEGIN{ a=6;b=3;print"(a - b)=",(a - b)}'
(a - b)= 3
[root@localhost ~]# awk 'BEGIN{ a=6;b=3;print"(a / b)=",(a / b)}'
(a / b)= 2
[root@localhost ~]# awk 'BEGIN{ a=6;b=3;print"(a % b)=",(a % b)}'
(a % b)= 0
更加詳細的awk命令,可以參考博文:awk學習
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。