文本處理工具補充之sed命令

sed:stream editor,行編輯器

        sed命令工作原理:它在處理數據時,每次只處理一行,首先把當前處理的行存儲在臨時緩沖區中,我們稱這個緩沖區稱為“”模式空間“,接著用sed命令處理緩沖區中的內容,處理完后,把緩沖區中的內容送到屏幕上顯示出來,接著去處理下一行,重復執行,直到至末行,這里需要注意的是我們沒有編輯原文件,原文件不會改變,當然我們也可以通過相關命令來編輯原文件。

        sed的主要功能:查找匹配到的文本打印出來,替換匹配到的文本,編輯文本等

       前面我們提到的grep也是針對行的操作的,也可以查找匹配到需要的內容,那么他們有什么區呢?grep:文本搜索工具,根據用戶指定的模式來對文本逐行匹配檢查,打印到匹配到的行,只能搜索不能編輯,-v和-o的功能與sed中的替換功能類似。

        在使用sed處理行時需要注意:如果說要去掉行中的某一部分內容或者是某刪除某部分內容,我們只能使用替換方法處理,因為sed時針對行編輯的,d選項操作會刪除整行。

       

    sed選項:

            -n:不輸出模式空間中的內容;默認情況下默認打印所有文本,也會打印我們匹配到的內容

            root@cenots6.8  ~ # sed '1p' /etc/issue 
            CentOS release 6.8 (Final)
            CentOS release 6.8 (Final)
            Kernel \r on an \
            root@cenots6.8  ~ # sed -n '1p' /etc/issue 
            CentOS release 6.8 (Final)

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

             -e:支持多點編輯

            root@cenots6.8  ~ # sed -n -e '1p' -e '1p' /etc/issue 
            CentOS release 6.8 (Final)
            CentOS release 6.8 (Final)

              a\:在匹配到的行的下一行添加內容

            root@cenots6.8  ~ # sed '1a\I am here' /etc/issue
            CentOS release 6.8 (Final)
            I am here
            Kernel \r on an \m

                i\:在匹配到的行的上一行添加內容

            root@cenots6.8  ~ # sed '1i\I am here' /etc/issue
            I am here
            CentOS release 6.8 (Final)
            Kernel \r on an \

                c\:把匹配到的行替換為你需要的內容

            root@cenots6.8  ~ # sed '1c\I am here' /etc/issue
            I am here
            Kernel \r on an \m

                 w:把匹配到的內容覆蓋到指定的文件中。。。。注意 覆蓋 覆蓋 覆蓋。。。。。

            root@cenots6.8  ~ # sed '1w /testdir/FA' /etc/issue
            CentOS release 6.8 (Final)
            Kernel \r on an \m
            root@cenots6.8  ~ # cat /testdir/FA
            CentOS release 6.8 (Final)

                 r:把文件中的內容輸入到匹配到的行的下一行

            root@cenots6.8  ~ # sed '1r /testdir/FA' /etc/issue
            CentOS release 6.8 (Final)
            aaaaaaaaaaaaaaaaaaaaaa
             Kernel \r on an \

                =:在匹配到的行顯示行號

            root@cenots6.8  ~ # sed '2=' /etc/issue
            CentOS release 6.8 (Final)
            2
            Kernel \r on an \

                 ?。耗J娇臻g中匹配行取反處理

                        root@cenots6.8  ~ # cat /etc/issue
                        CentOS release 6.8 (Final)
                        Kernel \r on an \m
                        root@cenots6.8  ~ # sed '1!d' /etc/issue
                        CentOS release 6.8 (Final)
                        root@cenots6.8  ~ # sed '1d' /etc/issue
                        Kernel \r on an \m

                &:匹配到的字符

            root@Centos7.2  ~ # sed -n 's@root@&superman@p' /etc/passwd   ----&superman 在匹配到的單詞后加superman
            rootsuperman:x:0:0:root:/root:/bin/bash
            operator:x:11:0:operator:/rootsuperman:/sbin/nologin
            root@Centos7.2  ~ # sed -n 's@root@superman&@p' /etc/passwd   ----&superman 在匹配到的單詞前加superman
            supermanroot:x:0:0:root:/root:/bin/bash
            operator:x:11:0:operator:/supermanroot:/sbin/nologin

                 s///:查找替換,支持使用正則表達,也可以將///替換為@@@

                                g: 行內全局替換
                                p: 顯示替換成功的行
                                w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中   

sed高級用法:
                h: 把模式空間中的內容覆蓋至保持空間中
                H:把模式空間中的內容追加至保持空間中
                g: 從保持空間取出數據覆蓋至模式空間
                G:從保持空間取出內容追加至模式空間
                x: 把模式空間中的內容與保持空間中的內容進行互換
                n: 讀取匹配到的行的下一行覆蓋至模式空間
                N:追加匹配到的行的下一行至模式空間
                d: 刪除模式空間中的行
                D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

       應用示例

                sed -n 'n;p' FILE          #顯示偶數行
                sed '1!G;h;$!d' FILE       #倒序顯示
                sed '$!N;$!D' FILE         #顯示最后兩行
                sed '$!d' FILE             #只顯示最后一行
                sed ‘G’ FILE             #每一行的后面加一個空行
                sed ‘g’ FILE             #將每行用空行替換
                sed ‘/^$/d;G’ FILE       #刪除所有空行后,在行后追加空行
                sed 'n;d' FILE             #顯示基數行
                sed -n '1!G;h;$p' FILE     #倒序排序

   

練習:

        1、替換/etc/inittab文件中“id:3:initdefault:”一行中的數字為5

        sed 's@\(id:\)[0-9]\(:initdefault:\)@\110000\2@' /etc/inittab

        2、刪除/etc/init.d/functions 文件中的空白行

        sed "/^$/d" /etc/init.d/functions

        3、刪除/etc/inittab 文件中的空白行

        sed "s@^#@@g" /etc/inittab

        4、刪除/etc/rc .d/rc.sysinit文件中以#后面跟至少一個空白符開頭的行的行首的#和空白字符

        sed "s@^#[[:space:]]\+@@g" /etc/rc.d/rc.sysinit

        5、刪除/boot/grub/grub.conf文件中行首空白字符

        sed "s@^[[:space:]]\+@@g" /boot/grub/grub.conf

        6、取出一個文件路徑的目錄名稱,如/etc/sysconfig/network,

        echo "/etc/sysconfig/network" |sed "s@/.*/@@g"        --basename
        echo "/etc/sysconfig/network" | sed 's@[^/]\+/\?$@@g'  --dirname                        
        echo "/etc/fst/sd" | sed   -r 's@(.*/)([^/]+/?)$@\2@'

        7、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符

                sed -e "s@^[[:space:]]\+@@g" -e "/^$/d" /etc/grub2.cfg

        8、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符

                sed 's@^#[[:space:]]\+@@g' /etc/fstab

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

                sed -r 's@(^.*$)@#\1@g' /root/install.log
                sed "s@\(.*\)@#\1@g" /root/install.log

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

              sed -r 's@(^[^#].*)@#\1@g' /etc/fstab
              sed "s@\(^[^#].*\)@#\1@g" /etc/fstab

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

               echo "/etc/fstab/" | sed   -r 's@(.*/)([^/]+/?)$@\2@'
               echo "/etc/fstab/" | sed 's@[^/]\{1,\}/\?$@@

        12、利用sed 取出ifconfig命令中本機的IPv4地址

                ifconfig|sed -n 2p |sed -r  's/.*addr:(.*)  Bca.*/\1/'
                ifconfig|sed -n 2p |sed -e  's/.*addr://' -e 's/ B.*//'

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

                cd /run/media/naruto/CentOS\ 7\ x86_64/Packages/
                ls *.rpm |sed -r 's#.*\.(.*)\.rpm$#\1#'|sort  |uniq -c
                ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c

        14、正則表達式表示身份證號

egrep "\<((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|(71|81|82))([0-9]){4}(19|20)([0-9]){2}((0[1-9])|(1[0-2]))(0[1-9]|([0-9])|(2[0-9])|(3[0-1]))([0-9]){3}([0-9]|X)\>" filename

        15、正則表達式表示手機號
grep -E -o "(\+86)?1[38][0-9]{9}|14[57][0-9]{8}|15[0-35-9][0-9]{8}|17[0678][0-9]{8}" haoma

        16、正則表達式表示郵箱

          egrep "\<([[:alnum:]]+(-|_)*[[:alnum:]]*)\>@([[:alnum:]]+\.)+[[:alnum:]]+" mail 
          grep -E -o '[a-zA-Z0-9]+[[:alnum:]\.\_-]*@[a-zA-Z0-9]+[[:alnum:]\.\_-]*' haoma

        17、正則表達式表示QQ號

          grep -E -o '\b[1-9][0-9]{4,12}\b' haoma

   

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

(0)
NarutoNaruto
上一篇 2016-08-11
下一篇 2016-08-11

相關推薦

  • shell腳本編程初步

    shell腳本編程初步    隨著課程學習的深入,我們已經學習了一些常用的命令,會去解決了一部分簡單的問題,但是這不能滿足復雜的工作,它可以幫助我執行自動化的常用命令、執行系統管理和故障排除、創建簡單的應用程序、處理文本或文件。所以我們開始了shell腳本的編程,幫助我們更好的去完成工作。簡單地說,shell編程相當于幫我們之前…

    Linux干貨 2016-08-15
  • linux 必須掌握的60個命令

    Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盤操作、文件存取、目錄操作、進程管理、文件權限設定等。所以,在Linux系統上工作離不開使用系統提供的命令。要想真正理解Linux系統, 就必須從Linux命令學起,通過基礎的命令學習可以進一步理解Linux系統。 不同Linux發行版的命令數量不一樣,但Linux發行版本最少的命令也有200…

    2017-09-05
  • FHS文件系統各目錄功能

    FHS       Filesystem Hierarchy Standard(文件系統目錄標準)的縮寫,多數Linux版本采用這種文件組織形式,類似于Windows操作系統中c盤的文件目錄,FHS采用樹形結構組織文件。FHS定義了系統中每個區域的用途、所需要的最小構成的文件和目錄,同時還給出了例外處理與矛盾處理。下為…

    Linux干貨 2016-10-16
  • LVM邏輯卷的縮減與刪除,LVM邏輯卷快照,btrfs文件系統,網絡管理

    邏輯卷縮減 縮減的時候要注意縮減的空間不要超過文件系統的空間,不然縮減的時候會損壞文件系統。 第一步要先取消掛載(必須) 第二部檢查文件完整性(必須) e2fsck -f /dev/vg0/lv0 第三部文件系統縮減,先縮減文件系統. resize2fs /dev/vg0/lv0 10G  (縮減到剩下10G) 第四步邏輯卷組的縮減 lvreduc…

    Linux干貨 2016-09-06
  • 進程管理

    1、ps命令 查看當前時刻的進程狀態,通過此命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等 進程狀態:     運行態:running     就緒態:ready     睡眠態: &…

    Linux干貨 2016-09-10
  • keepalived實現前端負載均衡器的高可用

    概述:     在之前的內容中,我們了解了當一個網站并發量大時,可以利用前端負載均衡器將用戶請求調度到后端的多個real server上,實現分散服務壓力,橫向擴展的方式,形成LB集群,但是試想一下,作為前端負載均衡器:     如果是LVS,萬一作為前端調度器的Director…

    Linux干貨 2016-11-01
欧美性久久久久