三劍客之sed

sed命令:Stream EDitor 流編輯器

sed命令的工作流程:

    sed會復制原文件中的一行或者多行,逐行進行操作。首先會將該行的內容放入到模式空間內,在模式空間內進行定界或者正則表達式匹配操作。

    a.如果該行內容不符合正則表達式或定界,該內容則被判斷為No,進行標準輸出。

    b.如果該行內容符合正則表達式或定界,該內容則被判斷為Yes,進行編輯(包括標準輸出)。

   sed中模式空間和保持空間中的內容會進行會換,這種會換會使文件內容進行多次的篩選編輯,完成復雜的任務。

    一般情況下,sed是不會改變原文件的內容,如果需要,可以加-i參數改變原文件的內容。(改變文件內容前最好將原文件進行變名的備份)

wKioL1enIj_Si5KVAABe3p3gDYc097.png

sed [OPTION] … 'script' [input-file]…

wKioL1enMerjFSyzAAAtSsZ9Y0I451.png

script:地址定界編輯命令


常用選項:

    -n:不輸出模式空間中的內容至屏幕

    -e:實現多點編輯

    -f /PATH/TO/SED_SCRIPT_FILE:每行一個編輯命令

    -r:支持使用擴展正則表達式

    -i:直接編輯原文件


地址定界:

  1. 不給地址:對全文進行處理(空地址)

  2. 單地址:

        #:指定行

        /pattern/:被此模式所匹配到的每一行

  3. 地址范圍:

        #,#:以第幾行到第幾行

        #,/pattern/:從指定的行開始到第1個pattern匹配到的行

        /par1/,/par2/:從第1個par匹配到的行到第2個par匹配到的行

        $:最后一行

  4. 步進地址:~

    1~2:所有奇數行

    2~2:所有偶數行


編輯命令:

    d:刪除          例:sed ‘1,5d’ /etc/fstab  把fstab文件中的第1到第5行刪除

    p:顯示模式空間中的內容

    a \text :在行后面追加文本“text”,支持\n實現多行追加

    i \text :在行前面插入文本“text”,

例:

[root@localhost ~]# sed '3i \newline' /etc/fstab     #在第3行前面插入newline


#

newline

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016


[root@localhost ~]# sed '3i \newline\nthis is anther line' /etc/fstab #支持\n


#

newline

this is anther line

# /etc/fstab


c \text :把匹配到的行替換為此處指定的文本"text"

例:

[root@localhost ~]# sed '/^UUID/c \#new line' /etc/fstab  #將所有UUID開頭的行替換                                                            為new line


#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# 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

#

#new line

#new line

#new line

#new line

tmpfs                   /dev/shm                tmpfs   defaults        0 0


w /PATH/TO/SOMEFILE/:保存模式空間匹配到的行至指定的文件中

例:

[root@localhost ~]# sed '/^[^#]/w /tmp/fstab.new' /etc/fstab  #將非#開頭的行保存                                                                  到/tmp/fstab.new中

[root@localhost ~]# cat /tmp/fstab.new 

UUID=d805bcfe-f510-4569-8bb8-3eed373118ea /                       ext4    defaults        1 1

UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot                   ext4    defaults        1 2

UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir                ext4    defaults        1 2

UUID=95011402-df68-4950-8584-23826c8d3a79 swap                    swap    defaults        0 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


r /PATH/FROM/SOMEFILE   :讀取指定文件的內容到當前文件被模式匹配到的行的行后面,實現文件合并

例:

[root@localhost ~]# sed '/UUID/r /etc/issue' /etc/fstab  #在所有UUID開頭的行后面插                                                           入/etc/issue文件內容


#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# 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=d805bcfe-f510-4569-8bb8-3eed373118ea /                       ext4    defaults        1 1

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot                   ext4    defaults        1 2

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir                ext4    defaults        1 2

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=95011402-df68-4950-8584-23826c8d3a79 swap                    swap    defaults        0 0

CentOS release 6.8 (Final)

Kernel \r on an \m

tmpfs                   /dev/shm                tmpfs   defaults        0 0


=  :為模式匹配到的行打印行號

!  :條件取反   (地址定界!編輯命令)

例:

[root@localhost ~]# sed '/^#/!d' /etc/fstab   #刪除fstab文件中不以#開頭的行

#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# 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

#

[root@localhost ~]# 


s///  :查找替換,其分隔符可自行制定,常用的有s@@@,s###等。

替換標記:

    g  :全局替換

    w  :將替換成功的結果保存到指定的文件中

    p  :顯示替換成功的行

例:

刪除/boot/grwb/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符

sed 's@^[[:space:]]\+@@' /etc/grub2.cfg   #該/etc/grub2.cfg文件在linux7系統上


刪除/etc/fstab文件中所有以#開頭的行的行首的#及#后面的所有空白字符

[root@localhost ~]# sed 's@^#[[:space:]]*@@' /etc/fstab


輸出一個絕對路徑給sed命令,取出其目錄,其行為類似于dirname

[root@localhost ~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'

/var/log/


高級編輯命令:

    h  :把模式空間中的內容覆蓋至保持空間中

    H  :把模式空間中的內容追加至保持空間尾部

    g  :把保持空間中的內容覆蓋至模式空間中

    G  :把保持空間中的內容追加至模式空間尾部

    x  :把模式空間中內容與保持空間中內容互換

    n  :覆蓋讀取匹配到的行下一行至模式空間中(覆蓋原行)

    N  :追加讀取匹配到的行下一行至模式空間中

    d  :刪除模式空間中的行

    D  :刪除多行模式空間中的所有行


例:

 

[root@localhost ~]# sed -n 'n;p' /etc/fstab   #顯示偶數行

#

# Created by anaconda on Fri Jul  8 21:17:42 2016

# Accessible filesystems, by reference, are maintained under '/dev/disk'

#

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0


[root@localhost ~]# sed '$!d' /etc/fstab           #取出最后一行

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0


[root@localhost ~]# sed '$!N;$!D' /etc/fstab            #取出最后兩行

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

                 

[root@localhost ~]# sed '/^$/d;G' /etc/fstab   #刪除原有的所有空白行,而后為所有的                                                 非空白行后添加一個空白行

#


# /etc/fstab


# Created by anaconda on Fri Jul  8 21:17:42 2016


#


# 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/rhel-root   /                       xfs     defaults        0 0


UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0


/dev/mapper/rhel-swap   swap                    swap    defaults        0 0


[root@localhost ~]# sed 'n;d' /etc/fstab      #顯示奇數行


# /etc/fstab

#

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

/dev/mapper/rhel-root   /                       xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0


[root@localhost ~]# sed 'G' /etc/fstab            #在每一行后面添加空白行



#


# /etc/fstab


# Created by anaconda on Fri Jul  8 21:17:42 2016


#


# 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/rhel-root   /                       xfs     defaults        0 0


UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0


/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

原創文章,作者:zebra930,如若轉載,請注明出處:http://www.www58058.com/31060

(0)
zebra930zebra930
上一篇 2016-08-08 16:08
下一篇 2016-08-08 16:08

相關推薦

  • 第六周作業補充-vim簡介及其使用方法詳細介紹

    What       Vim是由Vi發展出來的一個文本編輯器。代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富,在Unix& Unix Like操作系統中被廣泛使用。和Emacs并列成為Unix& Unix Like操作系統中最受歡迎的文本編輯器 When& Who  &nb…

    Linux干貨 2016-09-26
  • MySQL架構

    1.MySQL整體邏輯架構 我們先下圖看看MySQL整體邏輯架構(MySQL’s Logical Architecture)                       圖1  第一層,即最上一層,所包含的服務并不是MySQL所獨有的技術?!?/p>

    Linux干貨 2015-04-13
  • 關于 LVM 邏輯卷管理

                  邏輯卷管理 (LVM)    允許對卷進行方便操作的抽象層,包括從新設定文件系統的大小   允許在多個設備間重新組織文件系統將設備指定為物理卷用一個或者多個物理卷來創建一個卷組物理卷是用固定大小的物理區…

    系統運維 2016-09-02
  • LINUX-echo命令

    echo命令:回顯         語法:echo [-neE][字符串]     說明:echo會將輸入的字符串送往標準輸出。輸出的字符串間         以空白字符隔開,并在最后加上換行號。   &nbs…

    Linux干貨 2017-05-22
  • 文件、目錄權限

    批量創建新用戶: newusers passwd格式文件 批量創建用戶,必須和/etc/passwd下的文件格式一樣   下面開始批量創建:   首先準備好一個文件:用vi命令建一個user.txt 如圖: 然后用cat user.txt 然后newusers批量創建,cat /etc/passwd查看下: 創建成功 批量修改用…

    Linux干貨 2016-08-04
  • N26—第三周

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# who | cut -d ' ' -f 1 |sort -u l_cong root (unknown)   2、取出最后登錄到當前系統的用戶的相關信息。 [l_cong@localhost ~]$…

    Linux干貨 2017-02-15

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-10 15:00

    文章寫的很詳細,從原理到常見用法總結的很棒,有理論有操作。

欧美性久久久久