一、文本三劍客是什么?
1.?對于接觸過Linux操作系統的人來說,應該都聽過說Linux中的文本三劍客吧,即awk、grep、sed,也是必須要掌握的Linux命令之一,三者都是用來處理文本的,但側重點各不相同,awk功能最強大,但也最復雜。
二、文本三劍客介紹?
1. grep
?特點
- 使用正則表達式搜索文本
- 匹配到的文本會顯示出來并標紅
- 使用權限是所有用戶
工作方式?
- grep可以在一個或多個文件中檢索,如果條件中包含了空格,需要使用雙引號引起
工作結果
- 如果搜索成功則返回為0的狀態碼?,否則為1的狀態碼
格式
grep -參數 條件 文件名參數:-i 忽略大小寫
-c 統計匹配的行數
-v 取反,不顯示匹配的行-i
-w 匹配單詞
-E 等價于egrep,即啟用擴展正則表達式
-n 顯示行號
-rl 將指定目錄內的文件打印
-A數字 匹配行及以下n行
-B數字 匹配行及以上n行
-c數字 匹配行及上下n行
-q 靜默模式,沒有任何內容輸出,使用$?來判斷是否執行成功
-o 只顯示匹配的內容
示例
操作對象文件:/etc/passwd作用: 記錄賬戶的信息,共分為7段,使用冒號分割
意義: 賬戶名:密碼代號x: UID:GID: 注釋:家目錄:登錄的Shell
注意: 最后一段/sbin/nologin表述不允許登錄# 搜索/etc/passwd 含有root的字符串并顯示行號
[root@server ~]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin# 搜索/etc/passwd 含有sshd的字符串并顯示行號
[root@server ~]# grep -n "sshd" /etc/passwd
32:sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin# 匹配/bin/bash的行數,顯示行號
[root@server ~]# grep "/bin/bash" /etc/passwd | wc -l
22# 匹配不是/sbin/nologin的行,并顯示行號
[root@server ~]# grep -nv "/sbin/nologin" /etc/passwd # -n顯示行號 -i忽略大小寫
[root@server ~]# grep -ni "d" /etc/passwd # 匹配含有ftp行及以上3行內容
[root@server ~]# grep -nB3 "ftp" /etc/passwd
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
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
2.sed
介紹
sed命令是將一系列的編輯命令應用于批處理文本的理想工具。sed命令擁有非交互式和高效的特點,可以為用戶節約大量的時間。本節將介紹sed命令的基礎知識。
sed命令是一個非交互式的文本編輯器,它可以對來自文本文件以及標準輸出的行進行編輯。其中,標準輸出可以是來自鍵盤、文件重定向、字符串、變量或者是管道的文本。
sed命令會從文件或者標準輸入中一次讀取一行數據,將其復制到緩沖區,然后讀取命令行或者腳本的編輯子命令,對緩沖區中的文本行進行編輯。重復此過程,一直到所有的文本行都處理完畢。
工作原理
模式空間pattern space:sed在內存里開辟模式空間,處理文件的每個輸入行,最多8192字節
保留空間holding space:sed在內存里開辟保留空間,保存已經處理過的輸入行,最多8192字節
原理:sed 的工作流程主要包括讀取、執行和顯示三個過程
1.讀取:sed 從輸入流(文件、管道、標準輸入)中讀取一行內容并存儲到臨時的緩沖區中(又稱模式空間,pattern space)
2. 執行:默認情況下,所有的sed 命令都在模式空間中順序地執行,除非指定了行的地址,否則sed 命令 將會在所有的行上依次執行
3.顯示:發送修改后的內容到輸出流。在發送數據后,模式空間將會被清空
重復上述過程,直到將文件中所有數據處理完畢
基本語法
sed -參數 '[定址符]' '[操作]' 文件名參數:
-n,--quiet,--silent:安靜模式,不輸出模式空間中的內容,在一般sed的用法中,所有來自STDIN的數據一般都會被列出到屏幕上,但如果加上-n參數后,則只有經過sed特殊處理的那一行才會被列出來
-i: 直接編輯原文件,而不是由屏幕輸出,默認不對原文件進行操作
-e: 直接在命令行模式上進行sed的動作編輯,多個子命令之間也可以用分號隔開,如:sed -e command1; command2......filename 或者 sed -e 'command1' -e 'command2'......filename
-r:使用擴展正則表達式F
-f: 直接將sed的動作寫在一個文件內,-f filename則可以執行filename內的sed動作--help:顯示幫助--version:顯示版本-{}: 可組合多個命令,以分好隔開
定址符
用于使用數字指定處理行區間,或者使用正則進行過濾
表示方法
地址定界 | 作用 |
1,5 | 對文件的1-5行進行處理 |
2,$ | 對文件的2-最后一行進行處理 |
1,+3 | 對文件第一行以及以后的第三行內容進行處理 |
1~2 | 對文件的1,3,5,7,......的行進行處理 |
/正則表達式/ | 對任何能夠被正則表達式匹配帶的行進行處理 |
操作
S: 替換,普換指定字符,一般搭配正則表達式
d: 刪除,刪除選定的行。
p: 打印,如果同時指定行,表示打印指定行:如果不指定行,則表示打印所有內容:如果有非打印字符,則以 ASCII 碼輸出。其通常與“-n” 選項一起使用。
=: 打印行號。
a: 增加,a的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)
i: 插入,i的后面可以接字串,而這些字串會在新的一行出現(目前的上一行)
C: 行替換,指定行中的所有內容,普換成該選項后面的字符串。
y: 字符轉換,轉換前后的字符長度必須相同。
l(小寫):打印數據流中的文本和不可打印的ASCII字符(比如結束符$、制表符\t)
!: 對指定行以外的所有行應用命令
&: 代表匹配到的內容
詳細示例
### 切記多加練習!!!
[root@server ~]# vim sed1.txt[root@server ~]# sed -n 'p' sed1.txt #打印全文[root@server ~]# sed -n '=;p' sed1.txt # 打印全文并顯示行號[root@server ~]# sed -n -e '=' -e 'p' sed1.txt [root@server ~]# sed -n 'l' sed1.txt #打印控制字符[root@server ~]# sed -n '1p' sed1.txt # 打印第一行[root@server ~]# sed -n '1p' sed1.txt # 不加-n會顯示全部,加-n只顯示處理行
[root@server ~]#
[root@server ~]# sed -n '4,6p' sed1.txt #打印4-6行
four
five
six[root@server ~]# sed -n '7,$p' sed1.txt # 打印7到最后一行
seven
eight
nine
ten[root@server ~]# sed -n '$p' sed1.txt #打印最后一行
ten[root@server ~]# sed -n '1~2p' sed1.txt #打印基數行
one
three
five
seven
nine[root@server ~]# sed -n '2~2p' sed1.txt #打印偶數行
two
four
six
eight
ten
[root@server ~]# sed -n '4p;6p;8p' sed1.txt #打印4,6 8行
four
six
eight[root@server ~]# sed -n -e '4p' -e '6p' -e '8p' sed1.txt
four
six
eight[root@server ~]# sed -n '1!p' sed1.txt #打印非第一行內容
two
three
four
five
six
seven
eight
nine
ten[root@server ~]# sed -n '1,+5p' sed1.txt #打印第一行后的5行
one
two
three
four
five
six[root@server ~]# sed -n '/^f/p' sed1.txt #打印f開頭的行
four
five[root@server ~]# sed -n '/t/p' sed1.txt #檢索包含t的行
two
three
eight
ten[root@server ~]# sed -n '/^f/p;/t/p' sed1.txt #檢索f開頭行或者包含t的行
two
three
four
five
eight
ten[root@server ~]# sed -n '2,/five/p' sed1.txt #檢索第二行到five所在行
two
three
four
five[root@server ~]# sed -n '/n$/p' sed1.txt #檢索n結尾的行
seven
ten[root@server ~]# sed -n 'n;p' sed1.txt #打印偶數行
two
four
six
eight
ten[root@server ~]# sed -n 'p;n' sed1.txt #打印奇數行
one
three
five
seven
nine[root@server ~]# sed -n '$=' sed1.txt #打印行數
10
文本替換
范例文件
[root@server ~]# cp /etc/passwd ~/ps
[root@server ~]# ls
公共 視頻 文檔 音樂 anaconda-ks.cfg ps
模板 圖片 下載 桌面 passwd sed1.txt
格式
sed '行范圍s/舊字符串/新字符串/替換標記' 處理文件名
-
行范圍:使用數字表示,即對第幾行到第幾行進行替換管理處理,若省略則表示進行全文處理
-
s:替換動作
-
替換標記
1.數字: 使用1-512之間的數字,表示指定需要替換的字符串出現第幾次才進行替換
2.g: 對數據中所有匹配到的內容進行替換,若省略g則只會對第一次匹配的內容進行替換
3.p:替換成功立刻打印,一般與-n一起使用D:
4.w :文件名:將緩沖區的內容寫入到指定文件中
5.?&: 使用正則表達式匹配的內容進行替換
6.\: 轉義符,若有特殊符號或路徑則需要轉義
示例
# 替換root為boot
[root@server ~]# sed 's/root/boot/g' ps#將每一行的第一個root替換為admin
[root@server ~]# sed -n 's/root/admin/p' ps
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin#將本行第二次出現的root進行替換admin
[root@server ~]# sed -n 's/root/admin/2p' ps
root:x:0:0:admin:/root:/bin/bash#將全文所有root進行替換admin并打印
[root@server ~]# sed -n 's/root/admin/gp' ps
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin#將第四行的adm替換為root
[root@server ~]# sed -n '4s/adm/root/p' ps #替換第一個
root:x:3:4:adm:/var/adm:/sbin/nologin
[root@server ~]# sed -n '4s/adm/root/gp' ps #加g,全行替換
root:x:3:4:root:/var/root:/sbin/nologin#將行尾的/sbin/nologin替換為/bin/bash 注意:/需要轉義
[root@server ~]# sed -n 's/\/sbin\/nologin/\/bin\/bash/p' ps#注意:上例中替換內容包含路徑符號/,可以使用#暫時替代sed命令中的/,可改為
[root@server ~]# sed 's#/sbin/nologin#bin/bash#p' ps#將最后一行的:替換為@
[root@server ~]# sed -n '$s/:/@/gp' ps
fox_6@x@1000@1000@fox_6@/home/fox_6@/bin/bash#全文注釋
[root@server ~]# sed 's/^/#&/p' ps #指定位置處左側添加#
[root@server ~]# sed 's/^/#/p' ps#檢索ssh行在其單詞左側添加一個#
[root@server ~]# sed -n 's/SSH/#&/gp' ps
sshd:x:74:74:Privilege-separated #SSH:/usr/share/empty.sshd:/sbin/nologin
#右側添加#
[root@server ~]# sed -n 's/SSH/&#/gp' ps
sshd:x:74:74:Privilege-separated SSH#:/usr/share/empty.sshd:/sbin/nologin#所有的行首添加@及行尾添加@
[root@server ~]# sed -e 's/^/@&/' -e ' s/$/&@/' ps#在第一行之前插入空白行
[root@server ~]# sed '1s/^/\n/' ps#最后一行之后插入空白行
[root@server ~]# sed '$s/$/\n/' ps#所有小寫改為大寫,\u表示大寫 &:啟用正則
[root@server ~]# sed 's/[a-z]/\u&/g' ps#所有大寫改小寫,\l(小寫l):表示小寫字母
[root@server ~]# sed -i 's/[A-Z]/\l&/g' ps#單詞第一個字母大寫 \b:表示分匹配單詞的邊界
[root@server ~]# sed 's/\b[a-z]/\u&/g' ps
#實戰1:關閉或者打開selinux
[root@server ~]# sed -i '22s/disabled/enforcing/' /etc/selinux/config #實戰2:apache的網頁目錄修改
[root@server ~]# yum install httpd -y
[root@server ~]# sed -i -e '124s/\/var\/www.html/\/zy/' -e '129s/\/var\/www/\/zy/' /etc/httpd/conf/httpd.conf
[root@server ~]# vim /etc/httpd/conf/httpd.conf
#利用替換實現刪除#將全文的root刪除
[root@server ~]# sed -n 's/root//gp' ps#刪除每一行的第一個字符
[root@server ~]# sed -n 's/^.//p' ps #.代表任意#刪除每一行的最后字符
[root@server ~]# sed -n 's/.$//p' ps#刪除注釋符#
[root@server ~]# sed -n 's/^#//p' /etc/sos/sos.conf #刪除5-10行的所有數字
[root@server ~]# sed '5,10s/[0-9]//g' ps#刪除特殊字符(出來數字字母),即將結果寫入到t1.txt中
[root@server ~]# sed 's/[^(0-9)(a-z)(A-Z)]//gw t1.txt' ps
文本刪除
注意:d操作用于刪除文本的特定航,會刪除指定的所有內容,則使用該命令必須特別小心,若忘記指定處理行的話會刪除所有內容,也不會任何輸出
示例?
示例文件
[root@server ~]# cp /etc/sos/sos.conf ~/#刪除第一行
[root@server ~]# sed '1d' sos.conf #刪除2-5行
[root@server ~]# sed '2,5d' sos.conf #刪除8-最后一行
[root@server ~]# sed '8,$d' sos.conf #刪除最后一行
[root@server ~]# sed '$d' sos.conf #使用變量最為行號
[root@server ~]# num_line=1
[root@server ~]# sed "${num_line}d" sos.conf #注意雙引號#刪除空白行
[root@server ~]# sed '/^$/d' sos.conf #刪除帶[]
[root@server ~]# sed '/\[/d' sos.conf [root@server ~]# sed '/root/d' ps
插入文本
注意:使用a動作在文本最后追加一行,使用i動作在指定行前添加一行,倆者格式相同
?格式
sed '行范圍a(或i)\新文本' 文件名
示例
[root@server ~]# sed -i '$a\192.168.228.133 www.openlab.com' /etc/hosts[root@server ~]# sed -i '3i\192.168.228.132 www.openlab.com' /etc/hosts[root@server ~]# sed -i '/132/i\192.168.228.131 www.openlab.com' /etc/hosts#注意:sed是基于數據流處理的命令,若文本無內容則無法處理,座椅空文件無法插入內容
[root@server ~]# touch t2.txt
[root@server ~]# sed -i '$a\xaio ming 19,98.5' t2.txt
[root@server ~]# cat t2.txt