三劍客之SED

1.功能說明

Sed是Stream Editor(流編輯器)縮寫,是操作、過濾和轉換文本內容的強大工具。常用功能有增刪改查,過濾,取行。

[root@gumt ~]#sed --version 
    sed (GNU sed) 4.2.2

2.語法格式

SYNOPSIS
       sed [OPTION]... {script-only-if-no-other-script} [input-file]...

說明:

(1)注意sed和後面的選項之間至少有一個空格。
(2)爲了避免混淆,本文稱呼sed爲sed軟件。sed-commands(sed命令)是sed軟件內置的一些命令選項,爲了和前面的options(選項)區分,故稱爲sed命令。
(3)sed-commands既可以是單個sed命令,也可以是多個sed命令組合。
(4)input-file(輸入文件)是可選項,sed還能夠從標準輸入如管道獲取輸入。

        常用選項-[OPTION]:
        -n:不輸出模式空間中的內容至屏幕;
        -e script, --expression=script:多點編輯
            [root@gumt ~]#sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab
                    /etc/fstab
                    Created by anaconda on Mon Mar 11 20:02:33 2019

                    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

                    /dev/mapper/centos_gumt-root /                       xfs     defaults        0 0
                    /dev/mapper/centos_gumt-home /home                   xfs     defaults        0 0
                    /dev/mapper/centos_gumt-swap swap                    swap    defaults        0 0
        -f /PATH/TO/SED_SCRIPT_FILE:每一行一個編輯命令
        -r, --regexp-extended:支持使用正則表達式
        -i[SUFFIX], --in-place[=SUFFIX]:直接編輯源文件

    地址定界:
        (1)空地址:對全文進行處理
        (2)單地址:
            #:指定行
                /pattern/:被此模式所匹配到的每一行
        (3)地址範圍
            #,#:
            #,+#:
            #,/part1/
            $:最後一行
        (4)步進:~
            1~2:所有奇數行
            2~2:所有偶數行

    編輯命令:
        d:刪除
            [root@gumt ~]#sed '11,12d' /etc/fstab
                #/etc/fstab
                #Created by anaconda on Mon Mar 11 20:02:33 2019
                #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

                /dev/mapper/centos_gumt-root /                       xfs     defaults        0 0
                UUID=7f9112ef-49d5-44b9-ab48-f78c34d70ee0 /boot      xfs     defaults        0 0

        p:顯示模式空間中的內容
            [root@gumt ~]#sed '11,12p' /etc/fstab
                #/etc/fstab
                #Created by anaconda on Mon Mar 11 20:02:33 2019

                #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

                /dev/mapper/centos_gumt-root /                       xfs     defaults        0 0
                UUID=7f9112ef-49d5-44b9-ab48-f78c34d70ee0 /boot      xfs     defaults        0 0
                */dev/mapper/centosgumt-home /home                   xfs     defaults        0 0
                /dev/mapper/centosgumt-home /home                   xfs     defaults        0 0
                /dev/mapper/centosgumt-swap swap                    swap    defaults        0 0
                /dev/mapper/centosgumt-swap swap                    swap    defaults        0 0

            a \text:在行後面追加文本“text”,支持使用\n實現多行追加
                [root@gumt ~]#sed '3a \new line' /etc/fstab
                        #/etc/fstab
                    **  new line**
                        #Created by anaconda on Mon Mar 11 20:02:33 2019
                        #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

                        /dev/mapper/centos_gumt-root /                       xfs     defaults        0 0
                        UUID=7f9112ef-49d5-44b9-ab48-f78c34d70ee0 /boot      xfs     defaults        0 0
                        /dev/mapper/centos_gumt-home /home                   xfs     defaults        0 0
                        /dev/mapper/centos_gumt-swap swap                    swap    defaults        0 0

        l \text:在行前面追加文本“text”,支持使用\n實現多行插入
        c \text:把匹配的行替換爲此處指定的文本“text”
        w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中
            [root@gumt ~]#sed '/^[^#]/w /tmp/fstab.bak' /etc/fstab
                #/etc/fstab
                #Created by anaconda on Mon Mar 11 20:02:33 2019

                #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

                /dev/mapper/centos_gumt-root /                       xfs     defaults        0 0
                UUID=7f9112ef-49d5-44b9-ab48-f78c34d70ee0 /boot      xfs     defaults        0 0
                /dev/mapper/centos_gumt-home /home                   xfs     defaults        0 0
                /dev/mapper/centos_gumt-swap swap                    swap    defaults        0 0

                [root@gumt ~]#cat /tmp/fstab.bak 
                /dev/mapper/centos_gumt-root /                       xfs     defaults        0 0
                UUID=7f9112ef-49d5-44b9-ab48-f78c34d70ee0 /boot      xfs     defaults        0 0
                /dev/mapper/centos_gumt-home /home                   xfs     defaults        0 0
                /dev/mapper/centos_gumt-swap swap                    swap    defaults        0 0

        r /PATH/TO/SOMEFILE:讀取指定文件的內容至當前文件被莫忽視匹配到的行後面;文件合併
            [root@gumt ~]#sed '3r /etc/issue' /etc/fstab
                #/etc/fstab
                \S
                Kernel \r on an \m

                #Created by anaconda on Mon Mar 11 20:02:33 2019

                #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

                /dev/mapper/centos_gumt-root /                       xfs     defaults        0 0
                UUID=7f9112ef-49d5-44b9-ab48-f78c34d70ee0 /boot      xfs     defaults        0 0
                /dev/mapper/centos_gumt-home /home                   xfs     defaults        0 0
                /dev/mapper/centos_gumt-swap swap                    swap    defaults        0 0

        = :爲模式空間匹配到的行打印行號
        !:條件取反;
            地址定界!編輯命令
                [root@gumt ~]#sed '/^#/!d' /etc/fstab
                    #/etc/fstab
                    #Created by anaconda on Mon Mar 11 20:02:33 2019

                    #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

        s///:查找替換,其分割符課可自行指定
            替換標記:
                g:全局替換
                w:/PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中
                p:顯示替換成功的行

3.示例

輸出長度不小於50個字符的行
    sed -n '/^.{50}/p'
統計文件中有每個單詞出現了多少次
    sed 's/ /\n/g' file | sort | uniq -c
查找目錄中的py文件,刪掉所有行級註釋
    find ./ -name "*.py" | xargs sed  -i.bak '/^[ ]*#/d'
查看第5-7行和10-13行
    sed -n -e '5,7p' -e '10,13p' file
僅輸出ip地址
    ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章