2021-05-12 14:32:11
sed行文字處理工具入門教學
2020-06-16 16:56:02
工作原理:
簡單的來說,Sed一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱之為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕,接著處理下一行,直到檔案末尾。
語法:
sed [option] [script'(sed自帶語法指令碼)] [input-file處理的檔案]
sed [選項] + "地址+命令 " file
常用option引數(+描述):
--help: | 獲取幫助資訊; |
-n: | 不輸出模式空間內容到螢幕,即不自動列印,配合編輯命令只列印符合條件字串; |
-e: | 多點編輯,可新增多個指令碼; |
-f: | /PATH/SCRIPT_FILE,從指定檔案中讀取編輯指令碼; |
-i: | 原檔案編輯(直接修改原處理檔案),不新增-i引數,不會對原檔案進行修改; |
-r : | 支援使用擴充套件的正規表示式; |
Script:
地址+命令
地址:
1.不給地址:對全文進行處理; 2.單地址:
#:指定的行(1p,2p...);
/pattern/:被模式匹配匹配到的字序列;
3.範圍地址: #,#:第幾行只第幾行(1,2p);
#,+#:從第#行起始向後+#行;
/pat1/,/pat2/:模式1匹配 所在行至模式2匹配所在行;
#,/pat/:第幾行只模式匹配行;
4.~:步進
1~2:奇數行
2~2:偶數行
編輯命令:
d: | 刪除模式空間匹配的行; |
p: | 顯示模式空間中的內容; |
a text: | 在指定行後追加文字,支援使用n多行追加文字; |
i test: | 在行前面插入文字,支援使用n實現多行插入; |
c test: | 替換行為單行或多行文字; |
w /PATH/Somefile: | 儲存模式匹配的行至指定檔案; |
r /PATH/Somefile: | 讀取指定檔案的文字至模式空間中匹配到的行後; |
=: | 為模式空間中的行列印行號; |
!: | 模式空間中匹配行取反操作; |
sed查詢替換:
s///:查詢替換(分隔符):
s@@@
s###
替換標記:
g:行內全域性替換;
p:顯示替換成功的行;
w /PATH/TO/Somefile:將替換成功的行報錯至檔案中;
操作原檔案:
[root@linuxidc ~]# cat -n Test.txt 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin
匹配列印(p):
#列印匹配root開頭的行: #每一行都讀到模式空間,不加-n引數預設進行輸出,這裡看到root:x:0:0:root:/root:/bin/bash輸出兩行 [root@linuxidc ~]# cat Test.txt | sed '/^root/p' root:x:0:0:root:/root:/bin/bash 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 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@linuxidc ~]# tail Test.txt | sed -n '/^root/p' root:x:0:0:root:/root:/bin/bash #列印包含root的行: [root@linuxidc ~]# cat -n Test.txt | sed -n '/root/p' 1 root:x:0:0:root:/root:/bin/bash 10 operator:x:11:0:operator:/root:/sbin/nologin #列印第二行: [root@linuxidc ~]# cat -n Test.txt | sed -n '2p' 2 bin:x:1:1:bin:/bin:/sbin/nologin [root@linuxidc ~]# #列印第一行到,第三行: [root@linuxidc ~]# cat -n Test.txt | sed -n '1,3p' 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 #列印第三行起始後三行: [root@linuxidc ~]# cat -n Test.txt | sed -n '3,+3p' 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 6 sync:x:5:0:sync:/sbin:/bin/sync #列印以nologin結尾的行:(匹配) [root@linuxidc ~]# cat -n Test.txt | sed -n '/nologin$/p' 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 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin #列印root開頭行至daemon開頭行 [root@linuxidc ~]# sed -n '/^root/,/^daemon/p' Test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin #列印最後一行 [root@linuxidc ~]# cat -n Test.txt | sed -n '$p' 10 operator:x:11:0:operator:/root:/sbin/nologin #不列印最後一行:(“!”表示取反) [root@linuxidc ~]# cat -n Test.txt | sed -n '$!p' 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #列印奇數行 [root@linuxidc ~]# cat -n Test.txt |sed -n '1~2p' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #列印偶數行 [root@linuxidc ~]# cat -n Test.txt |sed -n '2~2p' 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 10 operator:x:11:0:operator:/root:/sbin/nologin #參照變數:sed命令使用單引號:變數用單引號引起來,sed命令使用雙引號,解釋特殊符號原有意義 [root@linuxidc ~]# a=1 [root@linuxidc ~]# b=2 [root@linuxidc ~]# cat -n Test.txt | sed -n ''$a','$b'p' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin [root@linuxidc ~]# cat -n Test.txt | sed -n "$a,"$b"p" 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin
匹配刪除(d):
#刪除匹配root行 [root@linuxidc ~]# cat -n Test.txt | sed '/root/d' 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #刪除第二行 [root@linuxidc ~]# cat -n Test.txt | sed '2d' 1 root:x:0:0:root:/root:/bin/bash 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin #刪除1至9行 [root@linuxidc ~]# cat -n Test.txt | sed '1,9d' 10 operator:x:11:0:operator:/root:/sbin/nologin #刪除偶數行 [root@linuxidc ~]# cat -n Test.txt | sed '2~2d' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#刪除組態檔中以(#開頭的行和空行):
[root@linuxidc ~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
替換(s///):
#替換root字串為ROOT,s///:只是替換每行中第一個匹配到的字串 [root@linuxidc ~]# cat -n Test.txt | sed 's/root/ROOT/' 1 ROOT:x:0:0:root:/root:/bin/bash #第一行中只有第一個root替換成ROOT 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/ROOT:/sbin/nologin #唯一一個root #全域性替換root字串為ROOT,s///g [root@linuxidc ~]# cat -n Test.txt | sed 's/root/ROOT/g' 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/ROOT:/sbin/nologin #正則匹配 [root@linuxidc ~]# sed -n 's/^root/ROOT/p' Test.txt ROOT:x:0:0:root:/root:/bin/bash #分組使用:取出基本名,目錄名 [root@linuxidc ~]# dirname /etc/sysconfig/sshd /etc/sysconfig [root@linuxidc ~]# basename /etc/sysconfig/sshd sshd [root@linuxidc ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#1#' /etc/sysconfig/ [root@linuxidc ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#2#' sshd #使用&命令參照匹配內容並且替換, #註:&代表root,&.1:把root替換成root.1 [root@linuxidc ~]# cat -n Test.txt |sed 's/root/&.1/g' 1 root.1:x:0:0:root.1:/root.1:/bin/bash ...... #為1,2行新增註釋 [root@linuxidc ~]# cat -n Test.txt |sed '1,2s/^/#/' # 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
多點編輯(-e):
[root@linuxidc ~]# cat -n Test.txt |sed -e '4,5d' -e 's/root/ROOT/g' 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/ROOT:/sbin/nologin
新增/追加內容(a,i,c):
#i:在搜尋匹配到的上一行新增 [root@linuxidc ~]# cat -n Test.txt | sed '/root/i Root' Root 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin ...... #a:在搜尋匹配的下一行新增 [root@linuxidc ~]# cat -n Test.txt | sed '/root/a Root' 1 root:x:0:0:root:/root:/bin/bash Root 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ...... #c:替換搜尋匹配的行 [root@linuxidc ~]# cat -n Test.txt | sed '/root/c Root' Root 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ......
註:同樣可以指定地址單行新增,指定地址範圍新增......
儲存模式匹配的行至指定檔案(w):
#匹配1,2行追加Test1 [root@linuxidc ~]# cat -n Test.txt | sed '1,2w Test1' 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin [root@linuxidc ~]# cat Test1 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin
讀取指定檔案的文字追加至模式空間(r):
#讀取/etc/RedHat-release,追加至1,2行 [root@linuxidc ~]# cat -n Test.txt | sed '1,2r /etc/redhat-release' 1 root:x:0:0:root:/root:/bin/bash CentOS Linux release 7.2.1511 (Core) 2 bin:x:1:1:bin:/bin:/sbin/nologin CentOS Linux release 7.2.1511 (Core) 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
匹配到的行號:
#=: [root@linuxidc ~]# cat -n Test.txt | sed -n '/root/=' 1 10 #!:同之前可以
原檔案編輯(i):
注意:由於-i引數修改原組態檔,操作比較危險,可以使用-i.bak執行,生成原始檔.bak就是之前沒有改動的檔案(bak是自己制定,隨意指定)。
[root@linuxidc ~]# sed -i.bak '1,7d' Test.txt [root@linuxidc ~]# cat Test.txt halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@linuxidc ~]# cat Test.txt.bak #原檔案備份 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 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
空間操作:
n: | 讀取匹配到的行的下一行覆蓋至模式空間; |
N: | 讀取匹配到的行的下一行追加至模式空間; |
h: | 模式空間中內容覆蓋至保持空間中; |
H: | 模式空間中的內容追加至保持空間中; |
g: | 從保持空間取出資料覆蓋至模式空間; |
G: | 從保持空間取出內容追加至模式空間; |
d: | 刪除模式空間中的行; |
D: | 刪除當前模式空間開端至n的內容(不在傳至標準輸出),放棄之後的命令,對剩餘模式空間重新執行sed; |
x: | 模式空間中內容與保持空間內容進行互換; |
#取出偶數行: [root@linuxidc ~]# cat -n Test.txt | sed -n 'n;p' 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 10 operator:x:11:0:operator:/root:/sbin/nologin #取出奇數行: [root@linuxidc ~]# cat -n Test.txt | sed 'n;d' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #倒敘顯示: [root@linuxidc ~]# cat -n Test.txt |sed -n '1!G;h;$p' 10 operator:x:11:0:operator:/root:/sbin/nologin 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 8 halt:x:7:0:halt:/sbin:/sbin/halt 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 6 sync:x:5:0:sync:/sbin:/bin/sync 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 2 bin:x:1:1:bin:/bin:/sbin/nologin 1 root:x:0:0:root:/root:/bin/bash #列印檔案最後一行: [root@linuxidc ~]# sed 'N;D' Test.txt operator:x:11:0:operator:/root:/sbin/nologin #在每行後增加空行: [root@linuxidc ~]# sed 'G' Test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ......
本文永久更新連結地址:http://www.linuxidc.com/Linux/2018-01/150636.htm
相關文章