1.正則表達式的基礎
^ ^錨定行的開始如:/^sed/匹配所有以sed開頭的行
$ $錨定行的結束 如:/sed$/匹配所有以sed結尾的行
. .匹配一個非換行符的字符 如:/s.d/匹配s后接一個任意字符,然后是d
? 代表前趨字符的一次出現
* *匹配零或多個字符 如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行
[] 匹配指定范圍內的任意單個字符,如/[Ss]ed/匹配sed和Sed
[^] 匹配指定范圍外的任意單個字符
如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行
/< 錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行
/> 錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行
/( /) 引用標識,可以多次引用,并在后面以/1 /2來引用
x/{m,n/} 代表x的至少m次,至多n次出現
| 用于使用多個正則條件,匹配之一即可
+ 與. *類似,表示1個或多個重復字符
() 用于將多個內容組成單元組
\(..\) 保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers
& 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**
x\{m\} 重復字符x,m次,如:/0\{5\}/匹配包含5個o的行
x\{m,\} 重復字符x,至少m次,如:/o\{5,\}/匹配至少有5個o的行
x\{m,n\} 重復字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10個o的行
2.grep
作用:文本搜索工具,根據用戶指定的"模式(過濾條件)"對目標文本逐行進行匹配檢查;打印匹配的行
模式:有正則表達式的元字符及文本字符所編寫的過濾條件
正則表達式引擎:
grep [OPTIONS] [PATTERN] [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用選項:
--color=auto 對匹配到的文本著色后高亮顯示
-E 使用正則擴展
-e pattern 使用pattern中的正則
-f file 使用文件中的正則
-i 忽略大小寫(性能較差,最好先用tr統一轉換成大寫或小寫)
-o 僅顯示匹配到字符串本身;
-v 反向顯示不匹配的行
-V 顯示版本號
輸出控制選項:
-n 輸出行號
-q 不顯示未匹配的內容
-r 遞歸方式掃描文件
-l 只輸出匹配的文件名
-L 只輸出不匹配的文件名
-c 只顯示匹配的個數
-A 匹配的到后面幾行也顯示出來
-B 匹配的到前面幾行也顯示出來
-C 上下文,匹配的到前后面幾行也顯示出來
匹配次數:用在要指定其出現的次數的字符的后面,用戶限制其前面字符出現的次數
: 匹配器前面的字符任意次:0,1,多次
例如:grep "xy",abxy aby xxxy yab
.* 匹配任意長度的任意字符,貪婪模式,能匹配多長就匹配多長
\? 匹配其前面的字符0次或者1次;即其前面的字符可有可無的
+ 匹配其前面的字符一次或多次;即其前面的字符出現至少1次
{m} 匹配其前面的字符m次
{m,n} 匹配其前面的字符至少m次,至多n次
{0,n} 至多n次
{m,} 至少m次
位置錨定:
^ 行首錨定;用于模式的最左側
$ 行尾錨定;用于模式的最右側
^PATTERN$ 用PATTERN來匹配整行
^$ 空白行
^[[:space:]]*$ 空行或包含空白字符的行
單詞: 非特殊字符組成的連續字符(字符串)都為單詞
\< 或 \b 詞首錨定,用于單詞模式的左側,例如:grep "\<word"
> 或 \b 詞尾錨定,用于單詞模式的右側,例如:grep "word>"
\<PATTERN> 匹配完整單詞
分組及引用:
() 將一個或多個字符捆綁在一起,當作一個整體進行處理,例如:(xy)*ab
Note 分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄到內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\3:后向引用,引用前面的分組括號中的模式所匹配到的字符
常用示例:
1、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中的兩位數或三位數
grep "\<[[:digit:]]{2,3}>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且后面非空白字符的行
grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan"命令的結果中以"LISTEN"后跟0、1或多個空白字符結尾的行
netstat -tan|grep "LISTEN[[:space:]]*$"
5、grep "(l..e).*\1" lovers.txt
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
6、grep -i 'root' /etc/passwd 不區分大小寫顯示文件中有root的行
7、grep -v '^root' /etc/passwd 顯示文件中開關不是root和行
8、grep -n 'root' /etc/passwd 顯示文件中含有root的行,且打印此行在文件中的行號
9、grep -lr '$root' /etc 遞歸查找/etc下包含行結尾為root的文件名
10、grep -Lr 'root' /etc 遞歸查找/etc下文件中不包含root的文件名
11、grep -c 'root' /etc/passwd 統計文件中root出現的行數
12、grep "hello | world" 1.cpp 匹配包含hello的行和world的行
egrep命令:支持擴展正則表達式實現類似于grep文本過濾功能:grep -E
正則表達式引擎:egrep [OPTINS] PATTERN [FILE]
選項:與grep選項相似
-G:支持基本正則表達式
擴展正則表達式的元字符:
字符匹配:
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
次數匹配:
: 匹配器前面的字符任意次:0,1,多次
.: 匹配任意長度的任意字符,貪婪模式,能匹配多長就匹配多長
? 匹配其前面的字符0次或者1次;即其前面的字符可有可無的
+ 匹配其前面的字符一次或多次;即其前面的字符出現至少1次
{m} 匹配其前面的字符m次
{m,n} 匹配其前面的字符至少m次,至多n次
{0,n} 至多n次
{m,} 至少m次
位置錨定:
^ 行首錨定;用于模式的最左側
$ 行尾錨定;用于模式的最右側
\<或\b 詞首錨定,用于單詞模式的錨定
>或\b 詞尾錨定,用于單詞模式的錨定
分組及引用:
() 分組;括號內模式匹配到的字符會被記錄到正則表達式引擎的內部變量中
后向引用:\1,\2....或:
a|b a或b
C|cat C或cat
(c|C)at cat或Cat
常用示例:
1、找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行;至少有三種實現方式
grep "^[sS]" /proc/meminfo
grep -i "^sS" /proc/meminfo
grep -E "^(s|S)" /proc/meminfo
grep -E "^s|^S" /proc/meminfo
2、顯示當前系統上root、centos或者user1用戶的相關信息
grep -E "^(root|centos|user1>)" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某單詞后跟一個小括號的行
grep -Eo '_[[:alnum:]]+()' /etc/rc.d/init.d/functions
4、使用echo命令輸出一絕對路徑,使用egrep取出基名
echo "/root/ssf/erou/dfjl" | egrep -o "\<[[:alpha:]]>$" echo "/root/ssf/erou/dfjl" | grep -Eo "[^/]+/?$"
5、找出ifconfig命令結果中的1-255之間的數值
ifconfig | grep -oE "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"
6、添加用戶bash, testbash, basher以及nologin(其shell為/sbin/nologin)
而后找出/etc/passwd文件中用戶名同shell名的行
grep -E "^([^:]+>).\1$" /etc/passwd
3.sed
sed命令行格式為:sed [-nefri] ‘command’ 輸入文本/文件
常用選項:
-f 指定過濾腳本文件名
-e 后跟匹配表達式
-n 不顯示默認輸出
-r sed 的動作支援的是延伸型正則表達式的語法
-i 直接修改讀取的文件內容,而不是由屏幕輸出
常用命令:
a ∶ 新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)
c ∶ 取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行
d ∶ 刪除,因為是刪除,所以 d 后面通常不接任何內容
i ∶ 插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行)
p∶ 列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起用
s∶ 取代,可以直接進行替換的工作。通常這個 s 的動作可以搭配正則表達式。例如 1,20s/old/new/g
sed腳本上的命令:
sed '/root/a/text' /etc/passwd 在文件的root那一行后增加新行text
sed '/root/c/text' /etc/passwd 在文件的root那一行替換為text
sed '/root/i/text' /etc/passwd 在匹配行前插入text
sed '/root/d' /etc/passwd 刪除文件中含有root的那一行
h/H 復制或附加模式緩沖區到一個buffer
g/G 從buffer中取出并復制或附加到當前模式緩沖區
sed -e '/root/{h;d;}' -e '$g' /etc/passwd 將root行放在最后一行
p 打印行
sed -n '/root/{n;p;}' /etc/passwd 打印root行的下一行
sed '1,3y/abcdef/ABCDEF/' /etc/passwd 映射1-3行的小寫為大寫
s/xxx/yyy/g 文本替換
sed定址:
sed -n '1,3p' /etc/passwd 打印文件1-3行
sed -n '/root/,/sshd/p' /etc/passwd 打印文件root行與sshd行之間的行
sed -n '5,/^northeast/p' file
實例分享:






1、復制/etc/inittab文件至/tmp/目錄,替換/tmp/inittab文件中的"id:3:initdefault"一行數字為5
# cp /etc/inittab /tmp/# sed's/id:3:initdefault/id:5:initdefault/' /tmp/inittab
2、復制/etc/rc.d/init.d/functions文件至/tmp目錄,刪除/tmp/functions文件的空白行
# cp /etc/rc.d/init.d/functions/tmp/# sed '/^[[:space:]]*$/d'/tmp/functions
3、復制/boot/grub/grub.conf文件至/tmp/目錄,刪除/tmp/grub.conf文件中行首的空白字符
# cp /boot/grub/grub.conf /tmp/# sed 's@^[[:space:]]\+@@'/tmp/grub.conf
4、echo一個路徑給sed,通過sed取出其路徑名
例如echo"etc/sysconfig/network-scripts/" | sed,返回路徑名/etc/sysconfig/
# echo"/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'
4.awk
awk命令主要用于文本內容的分析處理
如果對處理的數據需要生成報告之類的信息,或者處理的數據是按列進行處理的,最好使用awk
awk讀入有’\n’換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域
$0則表示所有域,$1表示第一個域,$n表示第n個域
awk是一個報告生成工具,旨在把文件中讀取到的每一行的每個字段分別進行格式化
而后進行顯示,awk支持使用變量、條件判斷、循環、數組
比如說,以”:”分隔filename文本的每一行并且打印第一列
awk -F ':' '{print $1}' filename
通用格式:gawk 'pattern {action}' file
cmd | gawk 'pattern {action}'
工作原理:awk 掃描一行,放入變量$0中,然后行被分隔成各個域
以指定的分隔符進行分離,默認為空格,可以通過參數FS指定。各個域都存于變量$i中,至多100個域
sed和awk定制化顯示舉例
這里,我們可以制作一個文本my.txt,內容為:
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
需要顯示的結果為:
cat:betty
dog:frank
fish:george
goat:adam
如果采用sed,可以輸入
sed 's/This is my \(.*\),.*is \(.*\)/\1:\2/g' my.txt

如果采用awk,則有兩種方法
awk -F '[ ,]' '{print $4,$10}' OFS=":" my.txt
awk -F '[ ,]' '{printf("%s:%s\n",$4,$10)}' my.txt

1.顯示GID小于500的組
awk -F : '$3<500{print $1}' /etc/group
2.顯示默認的shell為nologin的用戶
awk -F : '$7~/nologin$/{print $1}' /etc/passwd
3.顯示eth0網卡文件的配置信息,注意,只顯示等號后面的值
awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
4.顯示/etc/sysctl。conf文件中定義的內核參數:只顯示名稱
awk -F =' !/^#|^$/{print $1}'/etc/sysctl.conf
5.顯示eth0網卡的ip地址,通過ifconfig命令結果進行過濾
ifconfig eth0 |awk '/inet addr/{print $2}' |awk -F : '{print $2}'