1. 程式人生 > >linux三劍客之sed

linux三劍客之sed

option log system 換行 內容 簡化 功能 jump tro

sed簡介
sed:Stream EDitor, 流編輯器、也叫行編輯器。  
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),  
接著用sed命令處理緩沖區中的內容,處理完成後,把緩沖區的內容送往屏幕。  
然後讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。  
這樣不斷重復,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。  

sed的功能  :
主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等

sed 工具的使用

sed用法:
    sed [option]...‘script‘ inputfile....  
常用選項:  
    -n: 不輸出模式中的內容至屏幕,不自動打印
    -e: 多點編輯
    -f: /path/somefile: 從指定文件中讀取編輯腳本
    -r: 支持使用擴展正則表達式
    -i: 編輯原文件,也可以使用-i.bak,先備份後做修改。

例子:

-e: 執行多個命令,也就是上述中的多點編輯

[root@centos6 ~/gawktest]#sed -e ‘s/brown/green/; s/dog/cat/‘ file
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.  

#用‘‘來,從而不需要使用分號,不過從開始以‘來編寫結尾的時候也需要用‘來結尾
[root@centos6 ~/gawktest]#sed -e ‘
> s/brown/green/
> s/dog/cat/‘ file
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.

-f: 從指定文件中讀取編輯腳本,如果有大量要處理的命令可以事先存放到一個文本文件裏面比較方便。後續可以使用sed -f filename file


[root@centos6 ~/gawktest]#cat script1 
s/brown/green/
s/fox/elephant/
s/over/cobbler/
s/dog/cat/
[root@centos6 ~/gawktest]#sed -f script1 file
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.

地址定界

1、不給地址: 默認對全文進行處理
2、單地址:

        2、1 #:指定的行,$: 最後一行  
        2、2 /pattern/: 被此處模式所能夠匹配到的每一行  

3、地址範圍:

        3、1  #,#  
        3、2  #,+#  
        3、3  /pat1/,/pat2/  
        3、4  #,/pat1/  

4、~:步進
1~2奇數行

[root@centos6 ~/gawktest]#seq 1 10 | sed ‘1~2p‘
1
1
2
3
3
4
5
5
6
7
7
8
9
9
10

4、2 2~2偶數行

[root@centos6 ~/gawktest]#seq 1 10 | sed ‘2~2p‘
1
2
2
3
4
4
5
6
6
7
8
8
9
10
10

編輯命令

d 刪除模式空間匹配的行

]#sed ‘/^UUID/d‘ /etc/fstab   刪除以UUID開頭的行

p 打印當前模式空間內容,追加到默認輸出之後,一般配合-n選項來

[root@centos6 ~/gawktest]#sed -n ‘/r..t/p‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

a [ \ ] text 在指定行後面追加文本,支持使用\n實現多行追加

[root@centos6 ~/gawktest]#sed  ‘/^UUID/a \ hello sed‘ /etc/fstab
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
 hello sed
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
 hello sed
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
 hello sed
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0
 hello sed

i [ \ ] text 在指定行前面插入文本

[root@centos6 ~/gawktest]#sed ‘/^UUID/i \head hello‘ /etc/fstab 
head hello
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
head hello
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
head hello
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
head hello
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0

c [ \ ] text 替換行為單行或多行文本

[root@centos6 ~/gawktest]#sed ‘/^UUID/c \uuid is 0‘ /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Thu Jul 19 09:43:42 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
uuid is 0
uuid is 0
uuid is 0
uuid is 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

w /path/to/somefile 保存模式空間匹配到的行至指定文件中

[root@centos6 ~/gawktest]#sed ‘/^UUID/w /tmp/fstab‘ /etc/fstab 
[root@centos6 ~/gawktest]#cat /tmp/fstab
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0

r /path/from 讀取指定文件的文本至模式空間中匹配到的行後

[root@centos6 ~/gawktest]#sed ‘6r /etc/issue‘ /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Thu Jul 19 09:43:42 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
CentOS release 6.10 (Final)
Kernel \r on an \m
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info=

= 為模式空間中匹配的行打印行號

[root@centos6 ~/gawktest]#sed ‘/^UUID/=‘ /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Thu Jul 19 09:43:42 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
9
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
10
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
11
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
12
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0

! 模式空間中匹配行取反處理

[root@centos6 ~/gawktest]#sed ‘/^UUID/!=‘ /etc/fstab 
1

2
#
3
# /etc/fstab
4
# Created by anaconda on Thu Jul 19 09:43:42 2018
5
#
6
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
7
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8
#
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0
13
tmpfs                   /dev/shm                tmpfs   defaults        0 0
14
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
15
sysfs                   /sys                    sysfs   defaults        0 0
16
proc                    /proc                   proc    defaults        0 0

高級編輯命令

        h:把模式空間中的內容覆蓋至保持空間中;
        H:把模式空間中的內容追加至保持空間中;
        g:從保持空間取出數據覆蓋至模式空間;
        G:從保持空間取出內容追加至模式空間;
        x:把模式空間中的內容與保持空間中的內容進行互換;
        n:讀取匹配到的行的下一行至模式空間;
        N:追加匹配到的行的下一行至模式空間;
        d:刪除模式空間中的行;
        D:刪除多行模式空間中的所有行;
        sed -n ‘n;p‘ file:顯示偶數行
        sed ‘1!G;h;$!d‘ file:逆向顯示文件內容
        sed ‘$!N;$!D‘ file:取文件後兩行
        sed ‘$!d‘ file:取出文件最後一行
        sed ‘G‘ file:在每一行後面加一行空白行
        sed ‘/^$/d;G‘ file:
        sed ‘n;d‘ file:顯示奇數行
        sed -n ‘1!G;h;$p‘ file:逆向顯示文件中的每一行

linux三劍客之sed