sed行編輯器

Linux文本處理三劍客之一:sed(Stream Editor)流編輯器

sed:

    將指定的文本文件內容逐行讀取至sed的臨時內存空間當中,稱為"模式空間",而后逐行查看是否被sed的地址定界所匹配到,如果匹配,則執行相應的編輯操作,否則,默認將模式空間中的內容打印至標準輸出

2016-08-09_212454.png  

    sed [OPTIONS…] 'script' FILE…

        script:地址定界加編輯命令

    OPTIONS:

        -n:靜默模式,不顯示模式空間中的內容

        -e 'script1' -e 'script2':可一個執行多個script,實現多點編輯

        -f SCRIPT_FILE:從指定的文件中執行script

        -r:啟用擴展的正則表達式

        -i:直接編輯原文件(危險操作)

            sed -i.bak 'script' FILE:在編輯原文件之前,將文件備份為FILE.bak

    

    地址定界:

        (1)空地址:表示編輯全文

        (2)單地址:

            #:指定的單個行

            /pattern/:指定的模式匹配到的所有行

        (3)地址范圍:

            #,#:指定行范圍,例如: 1,3表示從第1行到第3行

            #,+n:從指定的行開始向后加n行

            #,/pattern/:從指定的行開始到第一個能夠pattern匹配到的內容結束之間的所有行

            /pat1/,/pat2/:從第一個被pat1匹配到的行開始到第一個被pat2匹配到的行結束之間的所有內容

        (4)步進:~

            1~2:表示奇數行

            2~2:表示偶數行

    編輯命令:

        p:顯示所匹配到的所有行

        d:刪除所匹配到的行

        i \STRING:在匹配到的行前面追加新行,可使用\n換行符追加多行內容

        a \STRING:在匹配到的行后面追加新航,可使用\n換行符追加多行內容

         c \STRING:重新定義匹配到的行內容

        w /PATH/TO/SOMFILE:將匹配到的行保存至指定文件中

        r /PATH/TO/SOMFILE:將指定的文件內容追加至匹配到的行后面

        =:在匹配到的行前面顯示行號,行號單獨占據一行

        !:取反

            地址定界!編輯命令

        s/PATTERN/STRING/修飾符:查找并替換,其分隔符可自定義,例如s@@@,s###等等

            PATTERN:可使用正則表達式的模式進行查找匹配

            STRING:使用字符串定義替換的內容,可使用后向引用\1,\2,…

                &:引用前面PATTERN所匹配到的所有內容

            修飾符:

                p:顯示替換成功的內容

                w /PATH/TO/SOMFILE:將替換成功的內容保存至指定文件當中

                i:查找替換時忽略大小寫

                g:全局替換,默認只替換每行第一個被PATTERN所匹配到的內容

        

        

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

[root@CentOS7 ~]# cat /boot/grub2/grub.cfg | sed -r 's@^[[:space:]]+@@'
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi

      

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

[root@CentOS7 ~]# cat /etc/fstab | sed -r 's@^#[[:space:]]+@@'
This is one line.
This is two line.
This is three line.
#
/etc/fstab
Created by anaconda on Thu Jul 21 12:06:23 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=89ec9224-65c7-4461-9350-9d5e016d016c /                       xfs     defaults        0 0
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot                   xfs     defaults        0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir                xfs     defaults        0 0
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap                    swap    defaults        0 0
[root@CentOS7 ~]#

 

3.在/root/install.log每一行行首增加#號

[root@CentOS6 ~]# sed -r 's@^@#@' install.log
#Installing zip-3.0-1.el6_7.1.x86_64
#Installing rfkill-0.3-4.el6.x86_64
#Installing rdate-1.4-16.el6.x86_64
#Installing bridge-utils-1.2-10.el6.x86_64
#Installing b43-fwcutter-012-2.2.el6.x86_64
#Installing latrace-0.5.9-2.el6.x86_64
#Installing trace-cmd-2.2.4-3.el6.x86_64
#Installing crash-trace-command-1.0-5.el6.x86_64
#Installing m17n-db-thai-1.5.5-1.1.el6.noarch
#Installing scenery-backgrounds-6.0.0-1.el6.noarch
#Installing gnome-backgrounds-2.28.0-2.el6.noarch
#Installing ql2400-firmware-7.03.00-1.el6_5.noarch
#Installing iwl5000-firmware-8.83.5.1_1-1.el6_1.1.noarch
#Installing ql2100-firmware-1.19.38-3.1.el6.noarch
#Installing ivtv-firmware-20080701-20.2.noarch
#Installing libertas-usb8388-firmware-5.110.22.p23-3.1.el6.noarch
#Installing xorg-x11-drv-ati-firmware-7.6.1-2.el6.noarch
#Installing ql2500-firmware-7.03.00-1.el6_5.noarch
#Installing atmel-firmware-1.3-7.el6.noarch
#Installing zd1211-firmware-1.4-4.el6.noarch
#Installing iwl4965-firmware-228.61.2.24-2.1.el6.noarch
#Installing rt61pci-firmware-1.2-7.el6.noarch
#Installing iwl3945-firmware-15.32.2.9-4.el6.noarch
#Installing ql2200-firmware-2.02.08-3.1.el6.noarch
#Installing rt73usb-firmware-1.8-7.el6.noarch
#Installing ipw2100-firmware-1.3-11.el6.noarch
#Installing ql23xx-firmware-3.03.27-3.1.el6.noarch
#Installing ipw2200-firmware-3.1-4.el6.noarch
#Installing rootfiles-8.1-6.1.el6.noarch
#Installing man-pages-3.22-20.el6.noarch
#Installing words-3.0-17.el6.noarch
#*** FINISHED INSTALLING PACKAGES ***

        

4.在/etc/fstab文件中不以#開頭的行的行首增加#號

[root@CentOS6 ~]# sed -r 's@^[^#]@#&@' /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Thu Jul 21 15:34:03 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=f4d977bb-af76-4617-b07f-9c70ae42a056 /                       ext4    defaults        1 1
#UUID=7907abdd-41cd-4609-8392-80e4a88c5b4c /boot                   ext4    defaults        1 2
#UUID=50054489-14c8-4e49-a912-2ff368371653 /testdir                ext4    defaults        1 2
#UUID=d9f41da6-9df2-410f-8074-500425b26a3d 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
[root@CentOS6 ~]#

5.處理/etc/fstab路徑,使用sed命令取出其目錄名和基名

[root@CentOS6 ~]# echo /etc/sysconfig/network-scripts/ | sed 's@^\(.*\/\)\([^/]\+\/\?\)@\1@'    #取出目錄名
/etc/sysconfig/
[root@CentOS6 ~]# echo /etc/sysconfig/network-scripts/ | sed 's@^\(.*\/\)\([^/]\+\/\?\)@\2@'    #取出基名
network-scripts/
[root@CentOS6 ~]#

6.利用sed 取出ifconfig命令中本機的IPv4地址

[root@CentOS7 ~]# ifconfig | sed -n '/\<inet\>/p' | sed -r 's@inet (([[:digit:]]+\.){3}[[:digit:]]+).*@\1@'
        10.1.253.23
        127.0.0.1
        192.168.122.1
[root@CentOS7 ~]#

 

7.統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數

[root@CentOS7 Packages]# df -lh    #查看光盤是否掛載
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        50G  4.1G   46G   9% /
devtmpfs        475M     0  475M   0% /dev
tmpfs           489M   84K  489M   1% /dev/shm
tmpfs           489M  7.1M  482M   2% /run
tmpfs           489M     0  489M   0% /sys/fs/cgroup
/dev/sda5        20G   61M   20G   1% /testdir
/dev/sda1       197M  139M   59M  71% /boot
tmpfs            98M   20K   98M   1% /run/user/42
tmpfs            98M     0   98M   0% /run/user/0
/dev/sr0        7.3G  7.3G     0 100% /media/cdrom
[root@CentOS7 Packages]# ls | sed -r 's@.*\.([^.]+)\.rpm$@\1@' | sort | uniq -c    #取出倒數第二個字段的重復次數
   2000 i686
   2938 noarch
      1 TRANS.TBL
   4069 x86_64
[root@CentOS7 Packages]#

sed高級編輯命令:

    h:將模式空間中的內容取出覆蓋至保持空間當中

    H:將模式空間中的內容取出追加至保持空間當中

    g:將保持空間中的內容取出覆蓋至模式空間當中

    G:將保持空間中的內容取出追加至模式空間當中

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

    n:將匹配到的行的下一行內容覆蓋至模式空間當中

    N:將匹配到的行的下一行內容追加至模式空間當中

    d:將模式空間中的內容刪除

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

示例:

1.顯示文件偶數行

[root@CentOS7 Packages]# sed -n 'n;p' /etc/fstab 
#    This is two line.
#
# Created by anaconda on Thu Jul 21 12:06:23 2016
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot                   xfs     defaults        0 0
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap                    swap    defaults        0 0
[root@CentOS7 Packages]#

2.文件逆序顯示

[root@CentOS7 Packages]# sed '1!G;h;$!d' /etc/fstab 
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap                    swap    defaults        0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir                xfs     defaults        0 0
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot                   xfs     defaults        0 0
UUID=89ec9224-65c7-4461-9350-9d5e016d016c /                       xfs     defaults        0 0
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
# Created by anaconda on Thu Jul 21 12:06:23 2016
# /etc/fstab
#
#     This is three line.
#    This is two line.
#  This is one line.
[root@CentOS7 Packages]#

3.顯示文件的最后兩行內容

[root@CentOS7 Packages]# nl /etc/fstab | sed '$!N;$!D'
    13UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir                xfs     defaults        0 0
    14UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap                    swap    defaults        0 0
[root@CentOS7 Packages]#

4.將文件的空白行刪除,并且在每行后面添加空白行

[root@CentOS7 ~]# sed '/^$/d;G' /etc/fstab 
#  This is one line.
#    This is two line.
#     This is three line.
#
# /etc/fstab
# Created by anaconda on Thu Jul 21 12:06:23 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=89ec9224-65c7-4461-9350-9d5e016d016c /                       xfs     defaults        0 0
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot                   xfs     defaults        0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir                xfs     defaults        0 0
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap                    swap    defaults        0 0
[root@CentOS7 ~]#

5.顯示奇數行

[root@CentOS7 ~]# sed 'n;d' fstab 
#  This is one line.
#     This is three line.
# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=89ec9224-65c7-4461-9350-9d5e016d016c /                       xfs     defaults        0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir                xfs     defaults        0 0
[root@CentOS7 ~]#

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

(0)
zhai796898zhai796898
上一篇 2016-08-15 14:31
下一篇 2016-08-15 14:31

相關推薦

  • 學習筆記–權限管理

    文件系統的權限管理 1、Linux系統下每個目錄或文件的權限對象主要分為:屬主(u)、屬組(g)、其他用戶(o),針對每類訪問對象都定義了三種權限:讀(r)、寫(w)、執行(x),這三種權限針對目錄和文件的作用各不相同,以下將做詳細說明: 對于文件來說: 讀(r)權限:可以使用文本查看類工具讀取文件內容 寫(w)權限:可以修改文件內容,但不能刪除文件本身 執…

    Linux干貨 2016-08-05
  • LVM: Logical Volume Manager 邏輯卷管理

      一、LVM介紹         LVM: Logical Volume Manager, Version: 2             …

    Linux干貨 2016-09-19
  • samba

    samba samba概述 samba原理 samba服務 samba的命令 samba搭建實例 使用GUI工具SWAT管理samba samba概述 什么是samba? samba是基于smb(Server Message Block)協議的一種實現方式。 samba的功能是什么? samba能夠用來在windows,unix平臺間實現文件共享服務,不同于…

    Linux干貨 2016-04-28
  • LVS:三種模式的原理、調度算法、及應用介紹

    LVS三種模式原理(nat/dr/tun) LVS/NAT:   如上圖,客戶通過virtual IP (虛擬服務的IP地址,公網地址),訪問網絡服務時,請求報文到達調度器,調度器根據連接調度算法從一組真實服務器中選出一臺服務器,將報文的目標地址VIP,改寫成選定服務器的地址(RIP),報文的目標端口改寫成選定服務器的相應端口,最后將修改…

    Linux干貨 2016-10-30
  • N25-第14周博客作業

    系統的INPUT和OUTPUT默認策略為DROP; iptables -P INPUT DROP iptables -P OUTPUT DROP [root@localhost ~]# iptables -L -n  Chain INPUT…

    Linux干貨 2017-05-21
  • select循環解析

    前言:   select命令用于創建菜單,在select循環執行時會根據list數組給出選擇菜單,用戶選擇后的結果保存在變量中,然后給出菜單,等待用戶選擇。select是個死循環,如果用戶用戶想跳出選擇循環,需要在循環體中根據條件增加break語句。 格式: select variable in list do 循環體命令 done 示例: 在這個…

    Linux干貨 2016-08-24
欧美性久久久久