正規表達式與grep、sed工具使用簡介
一、正規表達式
其介紹如下:
\
将下一個字元标記符、或一個向後引用、或一個八進制轉義符
^
比對輸入字元串的開始位置
$
比對輸入字元串的結束位置
*
比對前面的子表達式任意次
+
比對前面的子表達式一次或多次(大于等于1次)
?
比對前面的子表達式零次或一次
{n}
n是一個非負整數
比對确定的n次
{n,}
至少比對n次
{n,m}
m和n均為非負整
數其中n<=m。最少比對n次且最多比對m次
.
比對除“\r\n”之外的任何單個字元
x|y
比對x或y
[xyz]
字元集合。比對所包含的任意一個字元
[^xyz]
負值字元集
合比對未包含的任意字元
[a-z]
字元範圍。比對指定範圍内的任意字元
[^a-z]
負值字元範圍。比對任何不在指定範圍内的任意字元
[A-Z]
大寫字母集
( )
定義組,可以用\1、\2等引用
\b
比對一個單詞邊界
\B
比對非單詞邊界
\d
比對一個數字字元
\D
比對一個非數字字元
\n
比對一個換行符
\r
比對一個回車符
\s
比對任何不可見字元
\S
比對任何可見字元
\t
比對一個制表符
\v
比對一個垂直制表符
\w
比對包括下劃線的任何單詞字元
\W
比對任何非單詞字元
\f
比對一個換頁符
二、grep介紹與用法
grep的選項:
-n 顯示行号
-o 隻顯示比對的内容
-q 沒有任何輸出,即靜默模式
-I 如果比對成功隻将檔案名列印出來
-A 2 如果比對成功将其後兩行一起列印出來不帶數字列印一行
-B 2 如果比對成功将其前兩行一起列印出來不帶數字列印一行
-C 2 如果比對成功将其前後兩行一起列印出來不帶數字列印一行
--color 帶顔色列印
-c count即将比對到的行數列印出來
-E 相當于egrep
-i 不區分大小寫
-v 取反,即不比對
-w 比對單詞
練習:
目标檔案/etc/passwd,使用grep指令或egrep
1.顯示出所有含有root的行:
<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKiom1jSL_6TGCRqAAAx-no2niI418.png-wh_500x0-wm_3-wmp_4-s_3938902023.png" target="_blank"></a>
2.輸出任何包含bash的所有行,還要輸出緊接着這行的上下各兩行的内容:
3. 顯示出有多少行含有nologin。
<a href="https://s2.51cto.com/wyfs02/M00/8F/0B/wKioL1jSMNiiak_HAAARpJxHOUc363.png-wh_500x0-wm_3-wmp_4-s_296071668.png" target="_blank"></a>
4.顯示出那些行含有root,并将行号一塊輸出。
<a href="https://s2.51cto.com/wyfs02/M00/8F/0D/wKiom1jSMQfxfbrdAAAgN8cR_o4467.png-wh_500x0-wm_3-wmp_4-s_2587489190.png" target="_blank"></a>
5.顯示出檔案
<a href="https://s2.51cto.com/wyfs02/M01/8F/0D/wKiom1jSMTGiKMgaAAAVPgt98Ws567.png-wh_500x0-wm_3-wmp_4-s_3436616209.png" target="_blank"></a>
6.建立使用者
abominable
abominate
anomie
atomize
編寫正規表達式,将他們比對出來
<a href="https://s3.51cto.com/wyfs02/M00/8F/0B/wKioL1jSN0jRB9AlAAA_w5Wty98229.png-wh_500x0-wm_3-wmp_4-s_3403521230.png" target="_blank"></a>
7.建四個使用者
Alex213sb
Wpq2222b
yH438PIG
egon666
egon
過濾出使用者名組成是字母+數字+字母的行
<a href="https://s4.51cto.com/wyfs02/M02/8F/0B/wKioL1jSOhjwBbNzAABAqY3BcEc459.png-wh_500x0-wm_3-wmp_4-s_944978490.png" target="_blank"></a>
8.顯示出/etc目錄下所有包含root的檔案名
9. 過濾掉/etc/ssh/sshd_config内所有注釋和所有空行
<a href="https://s2.51cto.com/wyfs02/M01/8F/0C/wKioL1jSRHSAG4GAAADHHVonvrE061.png-wh_500x0-wm_3-wmp_4-s_4038545495.png" target="_blank"></a>
三、sed的介紹與用法
sed 是一種流編輯器,它一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed指令處理緩沖區中的内容,處理完成後,把緩沖區的内容送往螢幕。接着處理下一行,這樣不斷重複,直到檔案末尾。檔案内容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反複操作;編寫轉換程式等。
sed [-nefr] [command]
選項與參數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到終端上。但如果加上 -n 參數後,則隻有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在指令列模式上進行 sed 的動作編輯;
-f :直接将 sed 的動作寫在一個檔案内, -f filename 則可以運作 filename 内的 sed 動作;
-r :sed 的動作支援的是延伸型正規表示法的文法。(預設是基礎正規表示法文法)
-i :直接修改讀取的檔案内容,而不是輸出到終端。
command:
a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行
d :删除,因為是删除啊,是以 d 後面通常不接任何東西
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即将某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作
s :取代,可以直接進行替換的功能,通常這個 s 的動作可以搭配正規表示法 例如 1,20s/舊字元串/新字元串/g
以/etc/passwd檔案為模闆
1,删除檔案每行的第一個字元。
<a href="https://s3.51cto.com/wyfs02/M02/8F/0F/wKiom1jSU62gM58vAADGkdQovMQ626.png-wh_500x0-wm_3-wmp_4-s_2542138768.png" target="_blank"></a>
2,删除檔案每行的第二個字元。
<a href="https://s4.51cto.com/wyfs02/M01/8F/0C/wKioL1jSVI2zd0_vAABuH8bOZ5w952.png-wh_500x0-wm_3-wmp_4-s_1942284069.png" target="_blank"></a>
3,删除檔案每行的最後一個字元。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSVN7S4ud1AABvkye9-v8056.png-wh_500x0-wm_3-wmp_4-s_764772418.png" target="_blank"></a>
4,删除檔案每行的倒數第二個字元。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSVS6hFnePAABu7IvACms779.png-wh_500x0-wm_3-wmp_4-s_3074137360.png" target="_blank"></a>
5,删除檔案每行的第二個單詞。
<a href="https://s1.51cto.com/wyfs02/M01/8F/0D/wKioL1jSV4Kg0OOnAACaOWQadIM902.png-wh_500x0-wm_3-wmp_4-s_1011328415.png" target="_blank"></a>
6,删除檔案每行的倒數第二個單詞。
<a href="https://s5.51cto.com/wyfs02/M02/8F/0F/wKiom1jSWImBgAYvAABj5IrLO8Y824.png-wh_500x0-wm_3-wmp_4-s_4138013003.png" target="_blank"></a>
7,删除檔案每行的最後一個單詞。
<a href="https://s4.51cto.com/wyfs02/M00/8F/0F/wKiom1jSWLmx_lodAABuDNJuKb0028.png-wh_500x0-wm_3-wmp_4-s_2084132930.png" target="_blank"></a>
8,交換每行的第一個字元和第二個字元。
<a href="https://s5.51cto.com/wyfs02/M01/8F/0F/wKiom1jSWTbBdwjHAACABwuwLQM176.png-wh_500x0-wm_3-wmp_4-s_1460897526.png" target="_blank"></a>
9,交換每行的第一個字元和第二個單詞。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSWrSyMpTdAADF-mnQ9lM044.png-wh_500x0-wm_3-wmp_4-s_370545484.png" target="_blank"></a>
10,交換每行的第一個單詞和最後一個單詞。
<a href="https://s2.51cto.com/wyfs02/M02/8F/0D/wKioL1jSXCeAz0kDAACENh54eRs829.png-wh_500x0-wm_3-wmp_4-s_1353857043.png" target="_blank"></a>
11,删除一個檔案中所有的數字。
<a href="https://s1.51cto.com/wyfs02/M00/8F/0F/wKiom1jSXJPRROKVAACXrWSyK08675.png-wh_500x0-wm_3-wmp_4-s_4110002114.png" target="_blank"></a>
12,删除每行開頭的所有空格。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKioL1jSXYrznwsKAABirmmWM4M205.png-wh_500x0-wm_3-wmp_4-s_3965667132.png" target="_blank"></a>
13,用制表符替換檔案中出現的所有空格。
<a href="https://s5.51cto.com/wyfs02/M01/8F/0F/wKiom1jSXeLxV6oCAACLfMthc9o274.png-wh_500x0-wm_3-wmp_4-s_4130006748.png" target="_blank"></a>
14,把所有大寫字母用括号()括起來。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKioL1jSXruADo9-AAB_jw-X5Go111.png-wh_500x0-wm_3-wmp_4-s_3274685327.png" target="_blank"></a>
15,列印每行3次。
<a href="https://s2.51cto.com/wyfs02/M00/8F/0F/wKiom1jSYemQhYqtAACALRZjFHg155.png-wh_500x0-wm_3-wmp_4-s_360292407.png" target="_blank"></a>
16,隻顯示每行的第一個單詞。
<a href="https://s5.51cto.com/wyfs02/M00/8F/0D/wKioL1jSYrTDD6a2AABCfp7fLfQ732.png-wh_500x0-wm_3-wmp_4-s_3243362359.png" target="_blank"></a>
18,用指令擷取格式為 mm/yy/dd 的日期格式,結合管道,将其換成 mm;yy;dd格式
<a href="https://s1.51cto.com/wyfs02/M02/8F/0F/wKiom1jSZ9HTkxLNAAAegeQb1hw583.png-wh_500x0-wm_3-wmp_4-s_4253479773.png" target="_blank"></a>
本文轉自 AltBoy 51CTO部落格,原文連結:http://blog.51cto.com/altboy/1909354