Shell—正則表達式(grep命令、sed工具)

前言

正則表達式對於系統管理員來說是非常重要的,熟練運用正則表達式可使工作變得更加簡單、方便。

一、正則表達式概述

正則表達式定義

正則表達式,又稱正規表達式、常規表達式

使用字符串來描述、匹配一系列符合某個規則的字符串

簡單來說,是一種匹配字符串的方法,通過一些特殊符號,實現快速查找、刪除、替換某個特定字符串。

正則表達式組成

普通字符:大小寫字母、數字、標點符號及一些其他符號

元字符:在正則表達式中具有特殊意義的專用字符

正則表達式的用途

正則表達式對於系統管理員來說是非常重要的,系統運行過程中會產生大量的信息,這些信息有些是非常重要的,有些則僅是告知的信息。身爲系統管理員如果直接看這麼多的信息數據,無法快速定位到重要的信息,如“用戶賬號登錄失敗”“服務啓動失敗”等信息。這時可以通過正則表達式快速提取“有問題”的信息。如此一來,可以將運維工作變得更加簡單、方便。

正則表達式分類

基礎正則表達式

擴展正則表達式

Linux中文本處理工具

支持基礎正則表達式:grep;sed

支持擴展正則表達式:egrep;awk

基礎正則表達式元字符

基礎正則表達式是常用的正則表達式部分

除了普通字符外,常見到以下元字符

■ \  :轉義字符,\!、 \n等     #讓特殊意義的元字符作普通字符使用
■ ^ :匹配字符串開始的位置
例: ^a、 ^the、 ^#
■ $ :匹配字符串結束的位置
例: word$
■  . :匹配除\n之外的任意的一個字符
 例: go.d、 g..d
■  * :匹配前面子表達式0次或者多次
 例: goo*d、 go.*d
■ [list] :匹配list列表中的一個字符
 例: go[ola]d 、[abc]、 [a-z]、 [a-z0-9]
■ [^list] :匹配任意不在list列表中的一個字符
 例: [^a-z]、 [^0-9]、 [^A-Z0-9]
■ \{n,m\} :匹配前面的子表達式n到m次,有\{n\}、 \{n,\}、\{n,m\}三種格式
 例: go\{2\}d、 go\{2,3\}d、 go\{2,\}d
 注意:“o{1,}” 等價於 “o+”  ;“o{0,}” 則等價於 “o*”

二、grep 命令

2.1 grep的使用規則:

  • -n:表示顯示行號
  • -i :表示不區分大小寫
  • -v:表示反向過濾
  • [ ]:查找集合字符

2.2 用法示例

grep -n 'the' test.txt     #文件檢索出帶‘the’的行並顯示行號
grep -vn 'the' test.txt   #文件反向檢索出不帶‘the’的行並顯示行號
grep -n 'sh[oi]rt' test.txt  #文件檢索出帶‘short’或‘shirt‘的行並顯示行號
grep -n 'oo' test.txt   #文件檢索出至少帶連續oo的行並顯示行號
grep -n 'o\{2\}' test.txt   #文件檢索出至少帶連續oo的行並顯示行號
grep -n 'o\{2,\}' test.txt   #文件檢索出至少帶連續oo的行並顯示行號
grep -n '[^w]oo' test.txt   #文件檢索出連續oo前面不帶w的行並顯示行號
grep -n '^[^w]oo' test.txt  #文件檢索出除w外,任意*oo開頭的行並顯示行號
grep -n ' [^a-z]oo ' test.txt  #文件檢索出連續oo前面不是小寫字母的行並顯示行號
grep -n '[0-9]' test.txt    #文件檢索出包含數字的行並顯示行號
grep -n '[^0-9]' test.txt  #文件檢索出不包含純數字的行並顯示行號,非純數字也會匹配
grep -n '[^#]' test.txt   #文件檢索出不包含#的行並顯示行號
grep -n '^the' test.txt  #文件檢索出以‘the’開頭的行並顯示行號
grep -n ‘^[a-z] ' test.txt   #文件檢索出以小寫字母開頭的行並顯示行號
grep -n ‘^[A-Z] ' test.txt   #文件檢索出以大寫字母開頭的行並顯示行號
grep -n '^[^a-zA-Z]' test.txt   #文件檢索出不以字母開頭的行並顯示行號
grep -n '\.$' test.txt  #文件檢索出以 . 號結尾的行並顯示行號
grep -n '^$' test.txt   #文件檢索出空行並顯示行號
grep -n 'w..d' test.txt  #文件檢索出帶有w開頭,d結尾,中間兩個任意字符的行並顯示行號
grep -n 'ooo*' test.txt  #文件檢索出帶有連續oo或兩個0以上的行並顯示行號
grep -n 'oo*' test.txt  #文件檢索出帶有o或一個0以上的行並顯示行號
grep -n 'w.*d' test.txt   #文件檢索出帶有w開頭,d結尾,中間任意字符也可中間什麼也沒有的行並顯示行號
grep -n '[0-9][0-9]*' test .txt  #文件檢索出帶有數字的行並顯示行號

三、sed 工具

sed(StreamEDitor)

一個強大而簡單的文本解析轉換工具,可以讀取文本,並根據指定的條件對文本內容進行編輯(刪除、替換、添加、移動等),最後輸出所有行或者僅輸出處理的某些行。

3.1 sed 工具使用規則

sed的工作流程

主要包括讀取、執行和顯示三個過程

讀取: sed從輸入流(文件、管道、標準輸入)中讀取一-行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space)

執行: 默認情況下,所有的sed命令都在模式空間中順序地執行,除非指定了行的地址,否則sed命令將會在所有的行上依次執行。

顯示: 發送修改後的內容到輸出流。在發送數據後,模式空間將會被清空。在所有的文件內容都被處理完成之前,上述過程將重複執行,直至所有內容被處理完。

注意:默認情況下所有的sed命令都是在模式空間內執行的,因此輸入的文件並不會發生任何變化,除非是用重定向存儲輸出。

sed命令常見用法

sed [選項] ‘操作’ 參數
sed [選項] -f scriptfile 參數

常見的sed命令選項

  • -e script: 指定sed編輯命令
  • -f scriptfile: 指定的文件中是sed編輯命令
  • -h或–help: 顯示幫助
  • -n、–quiet或silent:表示僅顯示處理後的結果。
  • -i: 直接編輯文本文件

常見sed命令的操作

  • a: 增加,在當前行下面增加一行指定內容。
  • c: 替換,將選定行替換爲指定內容。
  • d: 刪除,刪除選定的行。
  • i: 插入,在選定行上面插入一行指定內容。
  • p: 打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容;如果有非打印字符,則以ASCII碼輸出。其通常與“-n”選項一起使用。
  • s: 替換,替換指定字符。
  • y: 字符轉換。
  • p:n #奇數行
  • n:p #偶數行

3.2 用法示例

1、輸出符合條件的文本(p表示正常輸出)

nl test.txt | sed -n ‘p’ #輸出test.txt內容,nl是顯示行號和內容,爲的是輸出結果帶上行號

nl test.txt | sed -n '3p'   #輸出test.txt內容第三行帶行號
nl test.txt | sed -n '2,5p'   #輸出test.txt內容二到五行帶行號
nl test.txt | sed -n 'p:n'   #輸出test.txt內容奇數行帶行號,要先刪除空格
nl test.txt | sed -n 'n:p'   #輸出test.txt內容偶數行帶行號,要先刪除空格
nl test.txt | sed -n '1,5{p;n}'  #輸出test.txt內容奇數行1~5行帶行號
nl test.txt | sed -n '1,10{n;p}'  #輸出test.txt內容偶數行1~10行帶行號
nl test.txt l sed -n '10,${n; p}'  #輸出test.txt內容10行到最後一行的偶數行帶行號
sed -n '/the/p' test.txt     #輸出test.txt帶the的內容
grep -n 'the' test.txt   #文件檢索出帶‘the’的行並顯示行號
nl test.txt | sed -n '4,/the/p'    #輸出test.txt內容4行以後帶‘the’的行帶行號
sed -n '/the/=' test.txt   #輸出帶‘the’的行的行號
sed -n '/^PI/p' test.txt     #查找以‘PI’開頭的行輸出
sed -n '/[0-9]$/p' test.txt   #查找以數字結尾的行輸出
grep 'wood' test.txt   #查找帶‘wood’的行輸出
sed -n '/\<wood\>/p' test.txt    #輸出包含‘wood’的行,\< \>代表單詞邊界

2、刪除符合條件的文本 (d) #只刪除輸出流,不刪除源文件

nl 命令用於計算文件的行數和顯示內容

nl test.txt | sed '3d'        #刪除文本第三行
nl test.txt | sed '3,5d'        #刪除文本第三到第五行
nl test.txt l sed -n '/cross/p'     #查找帶‘cross’的行輸出帶行號
nl test.txt l sed  '/cross/d'     #刪除帶‘cross’的行
nl test.txt l sed  '/cross/!d'     #!取反,保留帶‘cross’的行
sed '/^[a-z]/d' test.txt | nl  #刪除以小寫字母開頭的行,結果顯示行號
sed '/^[a-z]/d' test.txt     #刪除以小寫字母開頭的行
sed -n '/\.$/d' test.txt   #刪除以 . 號結尾的行
sed 'p' test.txt    #所有內容輸出
sed '/^$/d' test. txt   #刪除空行
sed '/.$/d' test.txt   #刪除任意字符結尾的行,等於全刪

3、替換符合條件的文本

使用 sed 命令進行替換操作時需要用到 s (字符串替換);c (整行/整塊替換);y (字符轉換) 命令選項

sed 's/the/THE/' test.txt    #將每行中的第一個the替換爲THE
sed 's/1/L/2' test.txt    #將每行中的第2個1替換爲L
sed 's/the/THE/g' test.txt     #將文件中的所有the替換爲THE
sed 's/o//g' test.txt     #將文件中的所有o刪除(替換爲空串)
sed 's/^/#' test.txt      #在每行行首插入#號
sed '/the/s/^/#/' test.txt    #在包含the 的每行行首插入#號
sed 's/$/EOF/' test.txt    #在每行行尾插入字符串 EOF
sed '3,5s/the/THE/g' test.txt    #將第3~5 行中的所有the替換爲 THE
sed '/the/s/o/0/g'test.txt    #將包含the的所有行中的o都替換爲O

4、遷移符合條件的文本

在使用sed 命令遷移符合條件的文本時,常用到以下參數:

  • H:複製到剪貼板;
  • g、G:將剪貼板中的數據覆蓋/追加至指定行
  • w :保存爲文件
  • r :讀取指定文件
  • a:追加指定內容。
sed '/the/{H; d};$G' test.txt     #將包含the 的行遷移至文件末尾,{;}用於多個操作
sed '1,5 {H; d};17G' test.txt   #將第1~5 行內容轉移至第17行後
sed '/the/w out.file' test.txt    #將包含the 的行另存爲文件 out.file
sed '/the/r /etc/hostname' test.txt   #將文件/etc/hostname 的內容添加到包含 the 的每行以後
sed '3aNew' test.txt   #在第3行後插入一個新行,內容爲New
sed '/the/aNew' test.txt   #在包含the的每行後插入一個新行,內容爲New
sed '3aNew1\nNew2' test.txt  #在第3行後插入多行內容,中間的\n表示換行
注:\n和\r的區別:
\n:換行符  是另起一新行
\r :回車符  光標回到一舊行的開頭;

5、使用腳本編輯文件

使用sed腳本將多個編輯指令存放到文件中(每行一條編輯指令),通過“-f”選項來調用。

[root@client2 ~]# vi opt.list    #建立一個文件
5H       #文件內是sed的操作
5d
16G
[root@client2 ~]# sed -f opt.list test.txt      #對test.txt進行操作

Shell—正則表達式(grep命令、sed工具)

6、sed直接操作文件示例

編寫一個腳本,用來調整vsftpd 服務配置,要求禁止匿名用戶,但允許本地用戶

[root@server2 ~]# useradd dada
[root@server2 ~]# passwd dada
[root@server2 ~]# useradd xiaoxiao
[root@server2 ~]# passwd xiaoxiao
[root@server2 ~]# vi ftp.sh
#!/bin/bash
A=vsftpd
FTP=/etc/vsftpd/vsftpd.conf
yum -y install $A
sed -i -e '/local_enable/s/NO/YES/g' $FTP
sed -i -e '/write_enable/s/NO/YES/g' $FTP
sed -i -e 's/^#chroot_local_user=YES/chroot_local_user=YES/g' $FTP
sed -i  '$aallow_writeable_chroot=YES' $FTP
sed -i -e '/listen/s/NO/YES/g' $FTP
sed -i -e '/listen_ipv6/s/YES/NO/g' $FTP
systemctl start $A
netstat -anpt | grep $A
[root@server2 ~]# chmod +x ftp.sh
[root@server2 ~]# ./ftp.sh

Shell—正則表達式(grep命令、sed工具)

客戶機上安裝ftp進行訪問

[root@server1 ~]# yum -y install ftp
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): dada
ftp> exit
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): xiaoxiao
ftp> exit

Shell—正則表達式(grep命令、sed工具)

驗證成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章