這裏咱們就以存放本機全部用戶的/etc/passwd
文件作實例java
[root@localhost ~]# grep -n "root" /etc/passwd //-n表示顯示行號 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin
有重複的字符時,可以使用「[ ]」來進行集合匹配,每次只匹配「[ ]」中的一個字符。正則表達式
[root@localhost ~]# grep -n "[fn]tp" /etc/passwd 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 27:ntp:x:38:38::/etc/ntp:/sbin/nologin
在「[ ]」中括號中添加「^」表示進行反向選擇(有必定的基礎的朋友確定知道「^[ ]」表示定位行首,這裏「^」內外位置意思將徹底不一樣。)bash
[root@localhost ~]# grep -n "^[^root]" /etc/passwd //匹配除了以root開頭的全部選項 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin ...... 42:named:x:25:25:Named:/var/named:/sbin/nologin
在正則表達式中一個元字符,因此在這裏須要用轉義字符「\」將具備特殊意義的字符轉化成普通字符。ide
[root@localhost ~]# grep -n '\.$' test.txt 1:he was short and fat. 2:He was wearing a blue polo shirt with black pants. 3:The home of Football on BBC Sport online. 5:google is the best tools for search keyword.
在正則表達式中小數點(.)也是一個元字符,表明任意一個字符。工具
[root@localhost ~]# grep -n "r..t" /etc/passwd //(.)小數點這裏表明任一字符 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
在上述結果中,「root」字符串「r..t」匹配規則。若想要查詢 oo、ooo、ooooo 等資料,則須要使用星號(*)元字符。但須要注意的是,「*」表明的是重複零個或多個前面的單字符。「o*」表示擁有零個(即爲空字符)或大於等於一個「o」的字符google
[root@localhost ~]# grep -n "oo*" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ......
例如,查找三到五個 o 的連續字符,這個時候就須要使用基礎正則表達式中的限定範圍的字符「{ }」。由於「{ }」在 Shell 中具備特殊 意義,因此在使用「{ }」字符時,須要利用轉義字符「\」,將「{ }」字符轉換成普通字符。spa
[root@localhost ~]# grep -n "0\{2,\}" /etc/passwd //表示中間包含2以上o的字符串 11:games:x:12:100:games:/usr/games:/sbin/nologin 41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash
此外,grep 命令僅支持基礎正則表達式,若是使用擴展正則表達式,須要使用 egrep 或 awk 命令。awk 命令在後面的進行講解,這裏咱們直接使用 egrep 命令。egrep 命令與 grep 命令的用法基本類似。(grep命令能用的egrep命令一樣可以使用)code
擴展正則表達式元字符 | 做用 |
---|---|
+ | 做用:重複一個或者一個以上的前一個字符 |
? | 做用:零個或者一個的前一個字符 |
| | 做用:使用或者(or)的方式找出多個字符 |
() | 做用:查找「組」字符串 |
()+ | 做用:辨別多個重複的組 |
[root@localhost ~]# egrep -n "10+" /etc/passwd //使用「+」擴展元字符 11:games:x:12:100:games:/usr/games:/sbin/nologin 31:qemu:x:107:107:qemu user:/:/sbin/nologin 41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash [root@localhost ~]# egrep -n "10?" /etc/passwd //使用「?」擴展元字符 2:bin:x:1:1:bin:/bin:/sbin/nologin 9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11:games:x:12:100:games:/usr/games:/sbin/nologin [root@localhost ~]# egrep -n 'root|zhy' /etc/passwd //使用「|」擴展元字符 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash [root@localhost ~]# egrep -n '(f|n)tp' /etc/passwd //使用「()」擴展元字符,可與「|」一塊兒使用 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 27:ntp:x:38:38::/etc/ntp:/sbin/nologin
sed是一個很好的文件處理工具,自己是一個管道命令,主要是以行爲單位進行處理,能夠將數據行進行替換、刪除、新增、選取等特定工做ip
1.讀取:sed 從輸入流(文件、管道、標準輸入)中讀取一行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space)。
2.執行:默認狀況下,全部的 sed 命令都在模式空間中順序地執行,除非指定了行的地址,不然 sed 命令將會在全部的行上依次執行。
3.顯示:發送修改後的內容到輸出流。再發送數據後,模式空間將會被清空。在全部的文件內容都被處理完成以前,上述過程將重複執行,直至全部內容被處理完。字符串
sed [選項] '操做' 參數
sed [選項] -f scriptfile 參數 // scriptfile 表示腳本文件
-e :表示用指定命令或者腳原本處理輸入的文本文件。
-f :表示用指定的腳本文件來處理輸入的文本文件。
-h :顯示幫助。
-n:表示僅顯示處理後的結果。
-i:直接編輯文本文件。
a:增長,在當前行下面增長一行指定內容。
c:替換,將選定行替換爲指定內容。
d:刪除,刪除選定的行
i:插入,在選定行上面插入一行指定內容。
p:打印,其一般與「-n」選項一塊兒使用
s:替換,替換指定字符。
y:字符轉換。
cat
命令:[root@localhost ~]# sed -n 'p' /etc/passwd //效果等同cat命令 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 ......
[root@localhost ~]# sed -n '10p' /etc/passwd //輸出第10行內容 operator:x:11:0:operator:/root:/sbin/nologin [root@localhost ~]# sed -n '2,4p' /etc/passwd //輸出2~4行內容 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
[root@localhost ~]# sed -n 'n;p' /etc/passwd //輸出奇數行,偶數行爲p;n bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt ......
[root@localhost ~]# sed -n '/root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n '/\<root\>/p' /etc/passwd //\< \>表明單詞邊界 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
sed 's/the/THE/' test.txt //將每行中的第一個the 替換爲 THE
sed 's/l/L/3' test.txt //將每行中的第 3 個l 替換爲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/O/g' test.txt //將包含the 的全部行中的o 都替換爲 O
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 表示換行