首頁 > 軟體

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):

[root@linuxidc ~]#  sed -i 's/adm/ADM/g' Test.txt
[root@linuxidc
~]# cat 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
ADM:x:
3:4:ADM:/var/ADM:/sbin/nologin
......

 注意:由於-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


IT145.com E-mail:sddin#qq.com