三劍客之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
下一篇 2016-08-08

相關推薦

  • vsftpd虛擬用戶搭建

    vsftpd虛擬用戶搭建 1.安裝vsftpd等一系列的安裝包 yum install vsftpd mariadb-server mariadb-devel pam-devel -y 2.安裝pam_mysql 下載:pam_mysql-0.7RC1.tar.gz wget -c ftp://172.16.0.1/pub/Sources/sources/p…

    Linux干貨 2017-06-06
  • 馬哥教育網絡班21期+第10周課程練習

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) POST(Power On Self Test): 檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常。 加載BIOS(Basic Input and Output System): 根據在BIOS中設置的系統啟動順序來搜索用于啟動系統的驅動器(硬盤、光盤、U…

    Linux干貨 2016-09-08
  • Linux Cluster之Keepalived + Nginx的實現

      一、實驗環境 http server1與http server2組成web集群,由nginx服務器實現負載均衡代理,使用keepalived保證nginx服務的高可用。通過虛擬IP192.168.154.177對外提供web服務。 實驗目的: 1)當Nginx server1上的nginx服務異常時,由nginx server2提供反帶服務。 …

    2016-11-02
  • 從shell眼中看世界–展開和引用

    這篇博客的目的在于加深對于展開和引用的理解,闡釋展開和引用之間聯系。 ‘ ‘ :強引用,其中的變量引用不會被替換為變量值,而保持原字符串       ” “:弱引用,其中的變量引用會被替換為變量值    如果之前對于’ …

    Linux干貨 2017-04-16
  • Linux運維之磁盤管理

    ※磁盤管理 計算機是由五大組成部件:輸入設備,輸出設備,存儲器,運算器,控制器,其中輸入設備我們稱之為I/O設備,如鍵盤,掃描器,運算器和控制稱之為cpu,存儲器如,內存,硬盤,優盤。計算機其實只需要內存和cpu其實已經可以完成工作了,但是內存屬于隨機存儲設備,斷電之后就丟失數據,所以我們就需要通過其他的輔助存儲設備來彌補內存的不足,這些輔存我們稱之為外存?!?/p>

    Linux干貨 2016-08-27
  • 網絡分層基礎概念與TCP,IP協議解析

    網絡分層基礎概念:   與ISO的OSI網絡分層模型不同。網絡分層事實上的標準為TCP/IP 的網絡分層模型。   下圖是他們是他們之間的對應關系。   左邊為OSI網絡分層模型。右邊為TCP/IP的網絡分層模型。 網絡分層,是將一個大而復雜的網絡,拆分為多個層次,每個層次單獨完成自己的任務,多個層次再結合起來,完成一個復雜的通…

    2017-05-04
欧美性久久久久