sed之高級命令的解析

            sed工作機制中另一個邏輯空間用于作為模式空間的好幫手,就是叫保持空間(hold space),在模式空間中處理一行內容會繼續處理下一行,那么對于處理過的行可能還有其他處理,因此可以先把處理好的數據存放在hold space 中,然后等到全部處理好之后在回到模式空間中。簡單的可以說是用于和模式空間配合使用交換空間里的數據達到想要的結果

其中一般用到hold space的稱作高級編輯命令:

高級編輯命令:

h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:把保持空間中的內容覆蓋至模式空間中
G:把保持空間中的內容追加至模式空間中
n:覆蓋讀取匹配到的行的下一行至模式空間中
N:追加讀取匹配到的行的下一行至模式空間中
d:刪除模式空間中的行
D:刪除多行模式空間中的首行
x:把模式空間中的內容與保持空間中的內容替換

 高級命令示例解析: 

 1.sed -n ‘n;p‘ file  顯示文件中偶數行(即2、4、6、8……行)

-n:不打印默認打印到屏幕上的所有行(靜默模式)

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

p:打印符合pattern psace的行

    [root@localhost ~]# cat SED.txt | tr -d '\n'
    12345678910    //這里我把換行刪除為節約空間便于觀察
    [root@localhost ~]# sed -n 'n;p' SED.txt 
      2
      4
      6
      8
      10

        解析:

            當sed讀取文件中的第一行,來到執行“n”命令,而“n”命令的作用是讀取匹配到的下一行到模式空間,也就是說我們現在模式空間中的是第一行,而“n”命令需要我們去讀它的下一行,也就是把第二行讀到模式空間,把第一行覆蓋了,而后又執行“p”命令,則是打印出pattern space 中的行,即打印第2行,由于我們使用“ -n ” 選項默認不打印pattern space 讀過的內容,而“p”命令是打印pattern space 符合條件的,所以打印第二行;

   接著讀取第三行,因為第二行在讀取第一行的時候已經被命令調用去讀取第二行。so讀取第三行,然后執行“n”命令,又去讀取第4行,從而覆蓋掉了第三行,然后打印第4行;………sed命令就這么一直執行下去,符合條件輸出的都是雙數行 。輸出的也就是偶數行

2.sed ’1!G;h;$!d' file 逆序顯示文件

        G:把保持空間中的內容追加至模式空間中        
        h:把模式空間中的內容覆蓋至保持空間中
        d:刪除行
        $:  最后一行
        ?。喝》?
        (1!G):除了第一行,其他都要執行G命令
        ($!d):除了最后一行,其他都有要執行“d”(刪除)命令
    [root@localhost ~]# sed  '1!G;h;$!d' SED.txt 
        10
        9
        8
        7
        6
        5
        4
        3
        2
        1

    解析:

        讀取文件第一行,判斷是不是第一行,如果是就不執行G命令,如果不是,就執行G命令,現在讀取的是第一行,所以不執行G命令,然后來到執行第二個命令(h),現在模式空間中的是第一行,則把第一行復制覆蓋到保持空間中,然后在執行下一個命令,判斷模式空間中的是不是最后一行,如果是,就不刪除,否則刪除,現在模式空間中的是第一行,所以刪除,保持空間中的內容不變;

接著讀取第二行,判斷出不是第一行,則執行“G”命令,把保持空間中原有的第一行追加讀取到模式空間中(現在模式空間中的順序為2在前1在后,因為是追加上去的),然后執行“h”命令,把模式空間中的行復制覆蓋到保持空間中,因此現在保持空間中的順序為第二行在前,第一行在后,然后判斷是否為最后一行時,模式空間中的第二行和第一行則被刪除掉; 

再接著讀取第三行,在依次進行判斷,得到最后的結果就是倒序顯示文件中的行。(繞了那么多,其實就是tac命令解決,這只是為了理解其含義)

  

  3.sed '$!d' file 取出文件最后一行

        $:最后一行        
        d:刪除行
        [root@localhost ~]# sed '$!d' SED.txt 
        10

     解析:

        讀取第一行到模式空間中,第一個命令判斷是否為最后一行,如果是,則不刪除,否則刪除,由此可知,只有最后一行不刪除,其他全刪除,就留下最后一行。則取出文件最后一行。

    4.sed ‘$!N;$!D' file  取出文件 最后兩行2

    N:追加讀取匹配到的行的下一行至模式空間中    
    D:刪除多行模式空間中的首行
    $:最后一行
  [root@localhost ~]# sed '$!N;$!D' SED.txt 
    9
    10

     解析:

        讀取第一行,然后執行第一個命令,(如果不是最后一行則追加讀取匹配到的當前行的下一行到模式空間中,)此時是第一行,然后執行"N"命令,把當前行的下一行追加讀取到當前的模式空間中,此時模式空間中為12兩行,然后再執行后面的命令(如果不是最后一行,則刪除當前多行中的首行,即刪除第一行,)此時模式空間中還剩下第二行(暫時保存在保持空間中,雖然沒有命令說要將行放到保持空間中,保持空間如果沒有命令指定用,則會用來保存模式空間處理過的行,以便模式空間之后需要使用);

則又去讀取第三行,然后判斷不是最后一行, 則追加當前的第三行的下一行(第四行)到模式空間中,(此時模式空間中加上原有剩下的第二行,為2和4行,)然后再判斷不是最后一行,則刪除當前模式空間中的第一行,留下第四行。

則繼續讀取第五行,此時為最后一行,然后第一個命令不執行“N”命令,再接著不執行D命令,即現在模式空間中的所剩下的行為第4行和第5行,然后打印模式空間的行出來即為文件的最后兩行。

    5.sed ‘/^$/d;G file  刪除原文件中的空白行,再添加空行到每一行的下面

這比較簡單,大伙試著自己分析吧,只要把高級命令各個所代表含義記熟這都不是事。(我也留幾個以后看的忘了好繼續分析理解)

    6.sed ’n;d' file 顯示奇數行

這和第一題恰好相反

    7.sed 'G' file  在原文件中的每一行添加空行,包括原有的空白行后面也添加空白行

這更不用解釋了

加油,付出就一定會有收獲的!??!

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

(1)
LiiLii
上一篇 2016-08-08
下一篇 2016-08-09

相關推薦

  • 馬哥教育網絡班20期 第9周課程練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash #the purpose of program : # #08/11/2016  PATH=/bin:/sbin:…

    Linux干貨 2016-08-15
  • 文本處理

    1 、查出分區空間使用率的最大百分比值   2、查出用戶UID最大值的用戶名、UID及shell類型   3、查出/tmp的權限,以數字方式顯示   4、統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序 5、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式) 6、顯示/etc/passwd文…

    Linux干貨 2016-08-08
  • N22-第十三周作業

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程)  1)共享名為shared,工作組為magedu;  2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名;  3)添加samb…

    Linux干貨 2016-11-14
  • 用戶、組及其管理

    用戶和組管理    Linux是一個多用戶、多任務的操作系統。多用戶、多任務就是可以在系統上建立多個用戶,多個用戶可以在同一時間內登錄同一臺主機的系統執行不同的任務,而互不影響。例如某臺linux服務器上有4個用戶,分別是root、www、ftp和mysql,在同一時間內root用戶可能在管理維護系統,www用戶可能在修改自己的程序和操作…

    Linux干貨 2016-08-04
  • 計算機及Linux系統基礎簡介

    一、計算機的組成及其功能 計算機由運算器,控制器,存儲器,輸入裝置和輸出裝置五大部件組成計算機,每一部件分別按要求執行特定的基本功能。 運算器或稱算術邏輯單元(Arithmetical and Logical Unit) 運算器的主要功能是對數據進行各種運算。這些運算除了常規的加、減、乘、除等基本的算術運算之外,還包括能進行“邏輯判斷”的邏輯處理能力,即“與…

    Linux干貨 2017-07-02
  • 磁盤管理

    1、設備文件 設備文件:關聯至一個設備驅動程序,進而能夠跟與之對應硬件設備進行通信 設備號碼: 主設備號major number,標識設備類型 次設備號minor number,標識同一類型下的不同設備 [root@localhost ~]# ll /dev/sd* brw-rw—-. 1 root disk 8,  0 Aug 25 …

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