文本處理工具補充之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 \

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

                        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 09:38
下一篇 2016-08-11 09:38

相關推薦

  • 正則表達式以及Linux文本搜索工具grep

    一正則表達式 regual Expression  簡稱REGEXP 定義:由一類特殊字符以及文本字所編寫的模式,其中有些字符不表示其字面意義,而用于統配和統配功能 分類:     基本正則表達式:BRE 貪婪模式(盡可能長地去匹配符合模式的內容     擴展表達式:E…

    Linux干貨 2016-08-07
  • MySQL or MariaDB 簡介

    DBMS:數據庫管理系統 RDBMS:關系型數據庫管理系統    總之:他們都是一個數據管理程序;大多都是CS架構,都有專門的通信協議進行數據交換 關系模型:               表(行或者列):二維關系 設計范式:       &…

    Linux干貨 2017-01-12
  • 馬哥教育網絡班22期+第二周課程練習

    1、Linux文件管理類命令     cp:copy files and directories 復制文件和目錄         單源復制:cp [OPTION]… [-T] SOURCE DEST   &n…

    Linux干貨 2016-08-22
  • 實驗:配置靜態路由1

    實驗:配置靜態路由1 IP地址規劃如下: 注意,環境準備: 1、MAC地址不要有沖突,如果是復制的虛擬機,對于centos6需刪除網卡定義文件rm -f /etc/udev/rules.d/70-persistent-net.rules 2、清空防火墻iptables -F(查看:iptables -vnL) 3、啟用IP轉發功能:echo 1 > /…

    2017-03-26
  • 壓縮與歸檔

    一、壓縮     壓縮:根據一定算法將數據以更加節省空間的形式存放。下面來看一下Linux常見的壓縮工具:     1、gzip/gunzip         后綴名:.gz   …

    Linux干貨 2015-05-04
欧美性久久久久