這里我們就以存放本機(jī)所有用戶的/etc/passwd
文件做實(shí)例
站在用戶的角度思考問題,與客戶深入溝通,找到淶源網(wǎng)站設(shè)計(jì)與淶源網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋淶源地區(qū)。
Demo1
[root@localhost ~]# grep -n "root" /etc/passwd //-n表示顯示行號(hào)
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
有重復(fù)的字符時(shí),可使用“[ ]”來進(jìn)行集合匹配,每次只匹配“[ ]”中的一個(gè)字符。
Demo2
[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
在“[ ]”中括號(hào)中添加“^”表示進(jìn)行反向選擇(有一定的基礎(chǔ)的朋友肯定知道“^[ ]”表示定位行首,這里“^”內(nèi)外位置意思將完全不同。)
Demo3
[root@localhost ~]# grep -n "^[^root]" /etc/passwd //匹配除了以root開頭的所有選項(xiàng)
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
在正則表達(dá)式中一個(gè)元字符,所以在這里需要用轉(zhuǎn)義字符“\”將具有特殊意義的字符轉(zhuǎn)化成普通字符。
Demo4
[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.
在正則表達(dá)式中小數(shù)點(diǎn)(.)也是一個(gè)元字符,代表任意一個(gè)字符。
Demo5-1
[root@localhost ~]# grep -n "r..t" /etc/passwd //(.)小數(shù)點(diǎn)這里代表任一字符
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
在上述結(jié)果中,“root”字符串“r..t”匹配規(guī)則。若想要查詢 oo、ooo、ooooo 等資料,則需要使用星號(hào)(*)元字符。但需要注意的是,“*”代表的是重復(fù)零個(gè)或多個(gè)前面的單字符?!皁*”表示擁有零個(gè)(即為空字符)或大于等于一個(gè)“o”的字符
Demo5-2
[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
......
例如,查找三到五個(gè) o 的連續(xù)字符,這個(gè)時(shí)候就需要使用基礎(chǔ)正則表達(dá)式中的限定范圍的字符“{ }”。因?yàn)椤皗 }”在 Shell 中具有特殊 意義,所以在使用“{ }”字符時(shí),需要利用轉(zhuǎn)義字符“\”,將“{ }”字符轉(zhuǎn)換成普通字符。
Demo6
[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 命令僅支持基礎(chǔ)正則表達(dá)式,如果使用擴(kuò)展正則表達(dá)式,需要使用 egrep 或 awk 命令。awk 命令在后面的進(jìn)行講解,這里我們直接使用 egrep 命令。egrep 命令與 grep 命令的用法基本相似。(grep命令能用的egrep命令同樣能夠使用)
擴(kuò)展正則表達(dá)式元字符 | 作用 |
---|---|
+ | 作用:重復(fù)一個(gè)或者一個(gè)以上的前一個(gè)字符 |
? | 作用:零個(gè)或者一個(gè)的前一個(gè)字符 |
| | 作用:使用或者(or)的方式找出多個(gè)字符 |
() | 作用:查找“組”字符串 |
()+ | 作用:辨別多個(gè)重復(fù)的組 |
Demo演示
[root@localhost ~]# egrep -n "10+" /etc/passwd //使用“+”擴(kuò)展元字符
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 //使用“?”擴(kuò)展元字符
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 //使用“|”擴(kuò)展元字符
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 //使用“()”擴(kuò)展元字符,可與“|”一起使用
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
27:ntp:x:38:38::/etc/ntp:/sbin/nologin
sed是一個(gè)很好的文件處理工具,本身是一個(gè)管道命令,主要是以行為單位進(jìn)行處理,可以將數(shù)據(jù)行進(jìn)行替換、刪除、新增、選取等特定工作
? 讀?。簊ed 從輸入流(文件、管道、標(biāo)準(zhǔn)輸入)中讀取一行內(nèi)容并存儲(chǔ)到臨時(shí)的緩
沖區(qū)中(又稱模式空間,pattern space)。
? 執(zhí)行:默認(rèn)情況下,所有的 sed 命令都在模式空間中順序地執(zhí)行,除非指定了行的地址,否則 sed 命令將會(huì)在所有的行上依次執(zhí)行。
? 顯示:發(fā)送修改后的內(nèi)容到輸出流。再發(fā)送數(shù)據(jù)后,模式空間將會(huì)被清空。
在所有的文件內(nèi)容都被處理完成之前,上述過程將重復(fù)執(zhí)行,直至所有內(nèi)容被處理完。
注意:默認(rèn)情況下,所有的sed命令都是在模式空間中進(jìn)行,并不會(huì)進(jìn)行保存。
sed [選項(xiàng)] '操作' 參數(shù)
sed [選項(xiàng)] -f scriptfile 參數(shù) // scriptfile 表示腳本文件
常用選項(xiàng)
-e :表示用指定命令或者腳本來處理輸入的文本文件。
-f :表示用指定的腳本文件來處理輸入的文本文件。
-h :顯示幫助。
-n:表示僅顯示處理后的結(jié)果。
-i:直接編輯文本文件。
常用的“操作”參數(shù)
a:增加,在當(dāng)前行下面增加一行指定內(nèi)容。
c:替換,將選定行替換為指定內(nèi)容。
d:刪除,刪除選定的行
i:插入,在選定行上面插入一行指定內(nèi)容。
p:打印,其通常與“-n”選項(xiàng)一起使用
s:替換,替換指定字符。
y:字符轉(zhuǎn)換。
輸出所有,效果等同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行內(nèi)容
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n '2,4p' /etc/passwd //輸出2~4行內(nèi)容
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
輸出所有奇數(shù)行
[root@localhost ~]# sed -n 'n;p' /etc/passwd //輸出奇數(shù)行,偶數(shù)行為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
......
輸出包含特定內(nèi)容的行(和grep命令一樣,可以使用^、$來定位行首、行尾)
[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 '/\/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//將每行中的第一個(gè)the 替換為 THE
sed's/l/L/3'test.txt//將每行中的第 3 個(gè)l 替換為L(zhǎng)
sed's/the/THE/g'test.txt//將文件中的所有the 替換為THE
sed's/o//g'test.txt//將文件中的所有o 刪除(替換為空串)
sed's/^/#/'test.txt//在每行行首插入#:號(hào)
sed'/the/s/^/#/'test.txt//在包含the 的每行行首插入#號(hào)
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
將文本進(jìn)行遷移
sed'/the/{H;d};$G'test.txt//將包含the 的行遷移至文件末尾,{;}用于多個(gè)操作
sed'1,5{H;d};17G'test.txt//將第 1~5 行內(nèi)容轉(zhuǎn)移至第 17 行后
sed '/the/wout.file'test.txt//將包含the 的行另存為文件out.file
sed '/the/r/etc/hostname'test.txt//將文件/etc/hostname 的內(nèi)容添加到包含the 的每行以后
sed'3aNew'test.txt //在第 3 行后插入一個(gè)新行,內(nèi)容為 New
sed'/the/aNew'test.txt//在包含the 的每行后插入一個(gè)新行,內(nèi)容為 New
sed'3aNew1\nNew2'test.txt//在第 3 行后插入多行內(nèi)容,中間的\n 表示換行
AWK 是一種用于處理文本的編程語言工具。AWK 在很多方面類似于 shell 編程語言,盡管 AWK 具有完全屬于其本身的語法,是任何環(huán)境中現(xiàn)有的功能最強(qiáng)大的數(shù)據(jù)處理引擎之一。
awk [選項(xiàng)] '模式或條件 {編輯命令}' 文件1 文件2 //過濾并輸出匹配內(nèi)容
awk -f 腳本文件 文件1 文件2 //從腳本中調(diào)用,并輸出
[root@localhost ~]# awk -F: '{print $1,$3}' /etc/passwd
//以“:”作為分隔符,篩選出第一列和第三列的內(nèi)容,并輸出(默認(rèn)情況下字段的分隔符為空格或者 tab 鍵)
root 0
bin 1
daemon 2
adm 3
......
FS:指定每行文本的字段分隔符,默認(rèn)為空格或制表位。
NF:當(dāng)前處理的行的字段個(gè)數(shù)。
NR:當(dāng)前處理的行的行號(hào)(序數(shù))。
$0:當(dāng)前處理的行的整行內(nèi)容。
$n:當(dāng)前處理行的第 n 個(gè)字段(第 n 列)。
FILENAME:被處理的文件名。
RS:數(shù)據(jù)記錄分隔,默認(rèn)為\n,即每行為一條記錄。
按行對(duì)文本進(jìn)行輸出
[root@localhost ~]# awk 'NR==2,NR==4{print}' /etc/passwd
//輸出第二行到第四行文本內(nèi)容
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 ~]# awk -F ":" 'NR==2,NR==4{print $1,$3}' /etc/passwd
//輸出第二行到第四行的第一列和第三列內(nèi)容
bin 1
daemon 2
adm 3
[root@localhost ~]# awk '(NR==1)||(NR==4){print}' /etc/passwd
//輸出第一行和第四行內(nèi)容
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
輸出奇、偶行(在awk中可以使用邏輯操作符“&&”,表示“與”, “||”表示“或”,“!”表示“非”;還可以進(jìn)行簡(jiǎn)單的數(shù)學(xué)運(yùn)算,如+、-、*、/、%、^分別 表示加、減、乘、除、取余和乘方)
[root@localhost ~]# awk 'NR%2==1{print}' /etc/passwd //輸出奇數(shù)行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......
[root@localhost ~]# awk 'NR%2==0{print}' /etc/passwd //輸出偶數(shù)行
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開頭的行
[root@localhost ~]# awk '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
統(tǒng)計(jì)以/bin/bash結(jié)尾的行數(shù)
[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}' /etc/passwd
2
統(tǒng)計(jì)以空行分隔的文本段落數(shù):
[root@localhost opt]# vim name.txt
zhangsan:lisi:wangwu
zhaoliu:liuliu
heiba:heihei
[root@localhost opt]# awk 'BEGIN{RS=":"};END{print NR}' /opt/name.txt
5
//統(tǒng)計(jì)規(guī)則:遇到關(guān)鍵符號(hào),折行
調(diào)用w 命令,并用來統(tǒng)計(jì)在線用戶數(shù):
[root@localhost opt]# awk 'BEGIN {while ("w" | getline) n++;{print n-2}}'
1