1.正則表達(dá)式的基礎(chǔ)
^ ^錨定行的開始如:/^sed/匹配所有以sed開頭的行
$ $錨定行的結(jié)束 如:/sed$/匹配所有以sed結(jié)尾的行
. .匹配一個(gè)非換行符的字符 如:/s.d/匹配s后接一個(gè)任意字符,然后是d
? 代表前趨字符的一次出現(xiàn)
* *匹配零或多個(gè)字符 如:/*sed/匹配所有模板是一個(gè)或多個(gè)空格后緊跟sed的行
[] 匹配指定范圍內(nèi)的任意單個(gè)字符,如/[Ss]ed/匹配sed和Sed[^] 匹配指定范圍外的任意單個(gè)字符
如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個(gè)字母開頭,緊跟ed的行
/< 錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行
/> 錨定單詞的結(jié)束,如/love\>/匹配包含以love結(jié)尾的單詞的行
/( /) 引用標(biāo)識(shí),可以多次引用,并在后面以/1 /2來引用
x/{m,n/} 代表x的至少m次,至多n次出現(xiàn)
| 用于使用多個(gè)正則條件,匹配之一即可
+ 與. *類似,表示1個(gè)或多個(gè)重復(fù)字符
() 用于將多個(gè)內(nèi)容組成單元組
\(..\) 保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers
& 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**
x\{m\} 重復(fù)字符x,m次,如:/0\{5\}/匹配包含5個(gè)o的行
x\{m,\} 重復(fù)字符x,至少m次,如:/o\{5,\}/匹配至少有5個(gè)o的行
x\{m,n\} 重復(fù)字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10個(gè)o的行
2.grep
作用:文本搜索工具,根據(jù)用戶指定的"模式(過濾條件)"對(duì)目標(biāo)文本逐行進(jìn)行匹配檢查;打印匹配的行
模式:有正則表達(dá)式的元字符及文本字符所編寫的過濾條件
正則表達(dá)式引擎:
grep [OPTIONS] [PATTERN] [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用選項(xiàng):
--color=auto 對(duì)匹配到的文本著色后高亮顯示
-E 使用正則擴(kuò)展
-e pattern 使用pattern中的正則
-f file 使用文件中的正則
-i 忽略大小寫(性能較差,最好先用tr統(tǒng)一轉(zhuǎn)換成大寫或小寫)
-o 僅顯示匹配到字符串本身;
-v 反向顯示不匹配的行
-V 顯示版本號(hào)
輸出控制選項(xiàng):
-n 輸出行號(hào)
-q 不顯示未匹配的內(nèi)容
-r 遞歸方式掃描文件
-l 只輸出匹配的文件名
-L 只輸出不匹配的文件名
-c 只顯示匹配的個(gè)數(shù)
-A 匹配的到后面幾行也顯示出來
-B 匹配的到前面幾行也顯示出來
-C 上下文,匹配的到前后面幾行也顯示出來
匹配次數(shù):用在要指定其出現(xiàn)的次數(shù)的字符的后面,用戶限制其前面字符出現(xiàn)的次數(shù)
: 匹配器前面的字符任意次:0,1,多次
例如:grep "xy",abxy aby xxxy yab
.* 匹配任意長(zhǎng)度的任意字符,貪婪模式,能匹配多長(zhǎng)就匹配多長(zhǎng)\? 匹配其前面的字符0次或者1次;即其前面的字符可有可無的
+ 匹配其前面的字符一次或多次;即其前面的字符出現(xiàn)至少1次
{m} 匹配其前面的字符m次
{m,n} 匹配其前面的字符至少m次,至多n次
{0,n} 至多n次
{m,} 至少m次
位置錨定:
^ 行首錨定;用于模式的最左側(cè)
$ 行尾錨定;用于模式的最右側(cè)
^PATTERN$ 用PATTERN來匹配整行
^$ 空白行
^[[:space:]]*$ 空行或包含空白字符的行
單詞: 非特殊字符組成的連續(xù)字符(字符串)都為單詞
\< 或 \b 詞首錨定,用于單詞模式的左側(cè),例如:grep "\<word"
> 或 \b 詞尾錨定,用于單詞模式的右側(cè),例如:grep "word>"
\<PATTERN> 匹配完整單詞
分組及引用:
() 將一個(gè)或多個(gè)字符捆綁在一起,當(dāng)作一個(gè)整體進(jìn)行處理,例如:(xy)*ab
Note 分組括號(hào)中的模式匹配到的內(nèi)容會(huì)被正則表達(dá)式引擎自動(dòng)記錄到內(nèi)部的變量中,這些變量為:
\1:模式從左側(cè)起,第一個(gè)左括號(hào)以及與之匹配的右括號(hào)之間的模式所匹配到的字符
\2:模式從左側(cè)起,第二個(gè)左括號(hào)以及與之匹配的右括號(hào)之間的模式所匹配到的字符
\3:后向引用,引用前面的分組括號(hào)中的模式所匹配到的字符
常用示例:
1、顯示/etc/passwd文件中不以/bin/bash結(jié)尾的行
grep -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中的兩位數(shù)或三位數(shù)
grep "\<[[:digit:]]{2,3}>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個(gè)空白字符開頭,且后面非空白字符的行
grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan"命令的結(jié)果中以"LISTEN"后跟0、1或多個(gè)空白字符結(jié)尾的行
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 不區(qū)分大小寫顯示文件中有root的行
7、grep -v '^root' /etc/passwd 顯示文件中開關(guān)不是root和行
8、grep -n 'root' /etc/passwd 顯示文件中含有root的行,且打印此行在文件中的行號(hào)
9、grep -lr '$root' /etc 遞歸查找/etc下包含行結(jié)尾為root的文件名
10、grep -Lr 'root' /etc 遞歸查找/etc下文件中不包含root的文件名
11、grep -c 'root' /etc/passwd 統(tǒng)計(jì)文件中root出現(xiàn)的行數(shù)
12、grep "hello | world" 1.cpp 匹配包含hello的行和world的行
egrep命令:支持?jǐn)U展正則表達(dá)式實(shí)現(xiàn)類似于grep文本過濾功能:grep -E
正則表達(dá)式引擎:egrep [OPTINS] PATTERN [FILE]
選項(xiàng):與grep選項(xiàng)相似
-G:支持基本正則表達(dá)式
擴(kuò)展正則表達(dá)式的元字符:
字符匹配:
. 匹配任意單個(gè)字符
[] 匹配指定范圍內(nèi)的任意單個(gè)字符
[^] 匹配指定范圍外的任意單個(gè)字符
次數(shù)匹配:
: 匹配器前面的字符任意次:0,1,多次
.: 匹配任意長(zhǎng)度的任意字符,貪婪模式,能匹配多長(zhǎng)就匹配多長(zhǎng)
? 匹配其前面的字符0次或者1次;即其前面的字符可有可無的
+ 匹配其前面的字符一次或多次;即其前面的字符出現(xiàn)至少1次
{m} 匹配其前面的字符m次
{m,n} 匹配其前面的字符至少m次,至多n次
{0,n} 至多n次
{m,} 至少m次
位置錨定:
^ 行首錨定;用于模式的最左側(cè)
$ 行尾錨定;用于模式的最右側(cè)
\<或\b 詞首錨定,用于單詞模式的錨定
>或\b 詞尾錨定,用于單詞模式的錨定
分組及引用:
() 分組;括號(hào)內(nèi)模式匹配到的字符會(huì)被記錄到正則表達(dá)式引擎的內(nèi)部變量中
后向引用:\1,\2....或:
a|b a或b
C|cat C或cat
(c|C)at cat或Cat
常用示例:
1、找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行;至少有三種實(shí)現(xiàn)方式
grep "^[sS]" /proc/meminfo
grep -i "^sS" /proc/meminfo
grep -E "^(s|S)" /proc/meminfo
grep -E "^s|^S" /proc/meminfo
2、顯示當(dāng)前系統(tǒng)上root、centos或者user1用戶的相關(guān)信息
grep -E "^(root|centos|user1>)" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某單詞后跟一個(gè)小括號(hào)的行
grep -Eo '_[[:alnum:]]+()' /etc/rc.d/init.d/functions
4、使用echo命令輸出一絕對(duì)路徑,使用egrep取出基名
echo "/root/ssf/erou/dfjl" | egrep -o "\<[[:alpha:]]>$" echo "/root/ssf/erou/dfjl" | grep -Eo "[^/]+/?$"
5、找出ifconfig命令結(jié)果中的1-255之間的數(shù)值
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’ 輸入文本/文件
常用選項(xiàng):
-f 指定過濾腳本文件名
-e 后跟匹配表達(dá)式
-n 不顯示默認(rèn)輸出
-r sed 的動(dòng)作支援的是延伸型正則表達(dá)式的語法
-i 直接修改讀取的文件內(nèi)容,而不是由屏幕輸出
常用命令:
a ∶ 新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)
c ∶ 取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行
d ∶ 刪除,因?yàn)槭莿h除,所以 d 后面通常不接任何內(nèi)容
i ∶ 插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行)
p∶ 列印,亦即將某個(gè)選擇的資料印出。通常 p 會(huì)與參數(shù) sed -n 一起用
s∶ 取代,可以直接進(jìn)行替換的工作。通常這個(gè) s 的動(dòng)作可以搭配正則表達(dá)式。例如 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 復(fù)制或附加模式緩沖區(qū)到一個(gè)buffer
g/G 從buffer中取出并復(fù)制或附加到當(dāng)前模式緩沖區(qū)
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
實(shí)例分享:
1、復(fù)制/etc/inittab文件至/tmp/目錄,替換/tmp/inittab文件中的"id:3:initdefault"一行數(shù)字為5
# cp /etc/inittab /tmp/# sed's/id:3:initdefault/id:5:initdefault/' /tmp/inittab
2、復(fù)制/etc/rc.d/init.d/functions文件至/tmp目錄,刪除/tmp/functions文件的空白行
# cp /etc/rc.d/init.d/functions/tmp/# sed '/^[[:space:]]*$/d'/tmp/functions
3、復(fù)制/boot/grub/grub.conf文件至/tmp/目錄,刪除/tmp/grub.conf文件中行首的空白字符
# cp /boot/grub/grub.conf /tmp/# sed 's@^[[:space:]]\+@@'/tmp/grub.conf
4、echo一個(gè)路徑給sed,通過sed取出其路徑名
例如echo"etc/sysconfig/network-scripts/" | sed,返回路徑名/etc/sysconfig/
# echo"/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'
4.awk
awk命令主要用于文本內(nèi)容的分析處理
如果對(duì)處理的數(shù)據(jù)需要生成報(bào)告之類的信息,或者處理的數(shù)據(jù)是按列進(jìn)行處理的,最好使用awk
awk讀入有’\n’換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域
$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域
awk是一個(gè)報(bào)告生成工具,旨在把文件中讀取到的每一行的每個(gè)字段分別進(jìn)行格式化
而后進(jìn)行顯示,awk支持使用變量、條件判斷、循環(huán)、數(shù)組
比如說,以”:”分隔filename文本的每一行并且打印第一列
awk -F ':' '{print $1}' filename
通用格式:gawk 'pattern {action}' file
cmd | gawk 'pattern {action}'
工作原理:awk 掃描一行,放入變量$0中,然后行被分隔成各個(gè)域
以指定的分隔符進(jìn)行分離,默認(rèn)為空格,可以通過參數(shù)FS指定。各個(gè)域都存于變量$i中,至多100個(gè)域
sed和awk定制化顯示舉例
這里,我們可以制作一個(gè)文本my.txt,內(nèi)容為:
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
需要顯示的結(jié)果為:
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.顯示默認(rèn)的shell為nologin的用戶
awk -F : '$7~/nologin$/{print $1}' /etc/passwd
3.顯示eth0網(wǎng)卡文件的配置信息,注意,只顯示等號(hào)后面的值
awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
4.顯示/etc/sysctl。conf文件中定義的內(nèi)核參數(shù):只顯示名稱
awk -F =' !/^#|^$/{print $1}'/etc/sysctl.conf
5.顯示eth0網(wǎng)卡的ip地址,通過ifconfig命令結(jié)果進(jìn)行過濾
ifconfig eth0 |awk '/inet addr/{print $2}' |awk -F : '{print $2}'