三劍客之Sed

sed:stream editor(流編輯器)

工作特性:并不直接處理文本文件本身,處理機制為每當處理一個文件的時候,它會逐行讀取,每次把一行讀取到內存空間中去,而后在模式空間(pattern space)中完成編輯.并把編輯好的結果輸出到屏幕上

 功      能:數據替換、刪除、增加、等,數據為關鍵字或者一整行,

模式空間:默認不編輯原文件,僅對模式空間中的數據做處理,處理結束后,把模式空間中的內容輸出到屏幕上。

保持空間:在模式空間中處理一行內容會繼續處理下一行,那么對于處理過的行可能還有其他處理,因此可以先把處理好的數據存放在hold space 中,然后等到全部處理好之后在回到模式空間中。

用法:

sed [OPTION]... script-only-if-no-other-script} [input-file]...
  script:指明要對指定位置做什么動作
          地址定界編輯命令(中間沒有空格)

option:

        -n:不輸出模式空間中沒被匹配到的內容,被匹配到的內容根據編輯命令決定是否輸出

            從文件中讀取行然后通過模式進行處理,如果不予給定模式相匹配,那么系統默認會將這些不匹配模式的行輸出到屏幕上,n選項的作用就是不顯示此類行,對于能匹配到的行,則通過編輯命令來決定是否輸出(如:d就直接刪除,p為顯示)

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

            指定地址定界中使用pattern匹配是使用擴展正則表達式

        -e:多個編輯命令對一個文件進行編輯 

            指定的多個script來處理輸入的文本文件

        – f:從文件中讀取編輯命令                 

            從文件中讀取script來處理輸出的文本文件

        – i:直接修改原文件                           

            將更改過的內容保存到原文件

地址定界:指定文本地址進行編輯

空地址:全文處理
#:指定文本中的某一行
/pattern/:被模式匹配到的每一行
#,#:從第幾行到第幾行
#,+#:從幾行開始的向下幾行
#,/pattern/:從指定的行到第一次被pattern匹配到的行之間的所有行
1~2:從第一行開始每隔一行      奇數行
2~2:從第二行開始每隔一行      偶數行

編輯命令:對指定的關鍵字或行進行編輯命令處理

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

1.sed  'd'  sed.txt    //刪除全文
2.sed  ‘1d’  sed.txt    //刪除第1行
3.sed  ‘/^[[:digit:]]/d'  sed.txt    //刪除以數字開頭的所有行
4.sed  '1,5d' sed.txt    //刪除第1行到第5行
5.sed  '3,+3' sed.txt    //刪除第3行及以下的3行(一共刪除了4行)
6.sed   '1,/^14/d  sed.txt     //刪除第1行到第一次匹配到以數字“14”開頭的行之間的所有行
7.sed   '1~2d'  sed.txt    //從第1行開始,每隔1行刪除1行(刪除2、4、6、8……)顯示奇數行
8.sed    '2~2d'  sed.txt    //從第2行開始,每隔1行刪除1行(刪除1、3、5、7……)顯示偶數行

   

    p:打印模式空間中的內容         (顯示被指定的地址定界范圍所框定的內容,而不是模式空間中的所有內容)

1.sed   '1,3p' sed   //顯示第1行到第三行(原有的文件里的會重復顯示一次,加上匹配到的第1到3行也會顯示)
2.sed  -n  '1,3p' sed   //此時原文件中的行就不會顯示來了(n 為不打印原文件中的行,接著被匹配到的行根據編輯命令來決定動作)

    a \test:在指定行后面添加文本行,內容為“\test”,支持使用\n實現多行插入

sed '/^[^[:digit:]]/a  \hello world '   sed.txt     
  //給文件中以非數字開頭的所有行的下方添加新行,內容為“hello world”

    i  \test:在指定行前面插入文本行,內容為“\test",支持使用\n實現多行插入  

sed '/^[[:digit:]]/i  \hello world '   sed.txt    
   //給文件中以數字開頭的所有行的上方添加新行,內容為“hello world”

    c \test:把匹配到的行替換成為此處指定的文本內容"\test"(整行替換)              

sed '/^[[:digit:]]/c \hello world' sed.txt     
   //把文件中所有以數字開頭的行內容覆蓋為指定的內容“hello world”

    w /path/to/somefile:保存模式空間中匹配到的行至指定文件中                         

  sed ’/^#/w /testdir/#.txt  sed.txt  
    //將文件中以#號開頭的行另存到 (/testdir/#.txt)文件中。

    s  /path/from/somefile:讀取指定文件中的內容到當前模式指定的行后面         

  sed '1r /etc/issue' sed.txt     
    //將/etc/issue文件中的內容讀取到sed.txt文件中的第1行后面

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

    sed  '/^#/='  sed.txt     //給sed.txt文件首行為#號開頭的行在其上方添加行號

?。簵l件取反                           

sed  '/^[[:digit:]]/!d'  sed.txt    //刪除sed.txt文件中不以數字開頭的行

s/pattern/string/修飾符:查找替換(默認只替換每一行中第一次被模式匹配到的字符串)

 將每一行當中能被模式匹配到的字符串替換成string字符串

sed 's@[[:digit:]]@AAA@g' sed     //將sed.txt文件中的數字全局替換成為字符”AAA“

    其中: 1.“@”符為分割符,可任意更改分隔符,但三個分割符必須為一致

        第1個@與第2個@之間的內容為地址定界,(就是我們需要替換的原內容)
        第2個@與第3個@之間的內容為轉換內容,(將前面需要替換的內容更改為此處的內容)
        第3個@符后面的為修飾符,用于更改系統默認的一些操作

      2、history | sed -r 's@^[[:space:]]+@@'
         //將history列表中的行首為一個空格字符以上字符不顯示(最后兩個@@中間沒有內容,就代表空,就表示把前面的替換成空,就相當于刪除行首的空格字符)

            修飾符(替換標記):加修飾符更改默認操作

               g:全局替換

                    系統默認是只操作每一行的首次匹配到的字符,如果一行后面還有符合條件的就不在執行。在最后一個@緊跟g,則表示全局符合條件的都執行操作。

                i:查找時忽略字符

            當我們在查找某字母時用的是小寫,然則我們要把這些字母轉換為其他的字符或字母,如果我們指定的字母為小寫,那么系統默認只更改小寫字母。

                     如果加上“ i  ”,則不區分大小寫,只要同字母就都執行

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

          history | sed -r 's@^[[:space:]]+@#@w sed.txt2'       
                //  將轉換成功的結果保存到sed.txt2文件中

              & 已匹配字符串標記(調用之前匹配到的字符串,位置任意)

         sed 's/^192.168.0.1/&localhost/' file
        //

示例:  

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

        [root@localhost test]# sed -r  's/^[[:space:]]+//' /etc/grub.conf

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

         sed 's/^#[[:space:]]\+//' /etc/fstab   //此刪除符合題目要求
         sed -r 's/^(#|#[[:space:]]+)//' /etc/fstab    //此命令則刪除#號沒空格的

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

        sed 's/^/#/' /root/install.log

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

        sed 's/^[^#]/#/' fstab

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

基名:echo "/etc/sysconfig/network-scripts/" | sed -r 's@.*/([^/]+)/?@\1@'
目錄:1.echo "/etc/sysconfig/network-scripts/" | sed -r 's@[^/]+/?$@@'
      2.echo "/etc/sysconfig/network-scripts/" | sed -r 's@(.*/)[^/]+/?@\1@'

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

ifconfig | sed '2!d' | sed  -r 's@.*inet.addr:(.*)B.*@\1@'

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

ls /mnt/Packages/* | sed -r 's@.*\.(.*)\.rpm$@\1@' | sort | uniq -c

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

(1)
LiiLii
上一篇 2016-08-08 21:57
下一篇 2016-08-08 22:23

相關推薦

  • 內置數據結構,列表及其方法

    List:列表有若干個元素,元素可以是任意對象,元素有順序,可以使用索引和迭代,使用線性結構,使用[ ]進行描述,在內存中的空間是連續的,每個元素在內存中的空間是一樣的………列表是可變的,列表不能一開始就定義大小,列表索引不可以超界   列表索引l.index(),從左向右搜索,發現第一個匹配的,自動返回搜索的值的索引;匹配不到,拋出異常Value…

    Linux干貨 2018-03-25
  • 關于nginx狀態監控字段的個人見解(求真相)

    今天看到了馬哥視頻其中一節對nginx狀態監控信息的介紹,對視頻ppt上的監控字段解析產生了一些疑問,ppt內容如下: active connections – 活躍的連接數量server accepts handled requests — 總共處理了xxx個連接 , 成功創建xxx次握手, 總共處理了xxx個請求reading — 讀取客戶端的連接數.w…

    Linux干貨 2016-07-12
  • linux之/home目錄轉移分區。

    linux之/home目錄轉移分區。     I,基本思路,將/home目錄的數據轉移到新的分區,再將/home目錄掛載到新的分區。     II,添加硬盤,進行分區,添加新硬盤不重啟機器識別命令echo “- – -”  /sys/class/scsi_host/host#/scan,然后進行 …

    Linux干貨 2017-06-19
  • 第一周作業

    一、計算機的組成及功能 計算機是由硬件和軟件組成, 1、硬件主要分為五個部分: 1) 控制器(Control)  CPU 2) 運算器(Datapath)   3) 存儲器(Memory)  內存 4) 輸入(Input system)  鍵盤、鼠標 5) 輸出(Out…

    Linux干貨 2017-07-11
  • vim編輯器

                                                      &nbsp…

    Linux干貨 2015-12-19
  • 玩轉linux之啟動篇

        想要玩轉linux,首先明白其啟動流程,這里簡單說明一下: CentOS 6啟動流程:    POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> roo…

    Linux干貨 2016-09-26
欧美性久久久久