系統基礎之sed工具詳解


sed工具詳解

NAME:

 sed – stream editor for filtering and transforming text(實現文本替換和過濾功能

類型: 行編輯器(流)

特點: 把文件中的每一行加載到內存中,匹配模式,把能夠匹配到模式的內容輸出到屏幕,不修改原文件

工作模式:

  每一次讀取一行文本,復制到模式空間(sed工作區間 pattern space ),先輸出到屏幕,判斷文本能否被模式匹配到,被匹配到的行執行編輯操作,編輯的結果標準輸出; 沒有被模式匹配到的行,直接標準輸出,可以被隱藏;

  保持空間:被匹配的行保存到保持空間 實現與模式空間進行操作

格式:

  sed [OPTION]… ’script‘ [input-file]…

      一次處理多行文本

  常用選項 OPTION:

     -n:不輸出模式空間中的內容到屏幕 

     -e script,–expression=script:多點編輯; 一條命令中,可執行兩條匹配規則,-e連接     例:sed -e ‘1~2p’ -e "3d" /etc/fstad

     -f PATH/TO/SED_SCRIPT_FILE  執行命令腳本 每行一個編輯命令

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

     -i[SUFFIX]:直接編輯原文件    建議使用: i.bak  sed 自動備份文件 

  地址定界命令

   (1)空地址:對全文進行處理

   (2)單地址:

      #指定行 

      /patten/:被此模式匹配到的每一行

    (3)地址范圍

     #,#:起始行到結束行

     #,+#: 3,+8  從3.加8行,包含第3 行

     #,/pat1/: 從第幾行到模式1匹配的行

     /pat1./pat2/ 模式1到模式2之間的行

     $:最后一行

   (4)步進:~        

     1~2:所有奇數行

     2~2:所有偶數

   (5)& 單詞追加

     追加的內容前加&,以為著前面的內容保留

     追加的內容后加&,以為著后面的內容保留

 編輯命令

    d:刪除   例:sed ‘1~2d’ /etc/passwd

    p:打印模式空間內容 指定行會顯示兩遍 命令加上-n使用

    a \text: 在被匹配到的行后面追加文本“text”,支持使用\n實現多行追加

    i \text: 在被匹配到的行前面插入文本“text”,支持使用\n實現多行插入

   c \text:把匹配到的行替換為此處指定的文本“text”;

    w /pATH/TO/SOMEFILE:保存模式空間內的行至指定的文件中

    r/PATH/FROM/SOMFILE:文件合并,讀取指定文件的內容至當前文件被模式匹配到的行后面

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

    ?。簵l件取反

     模式后面,命令前面

    s///:查找替換,其分隔符可自行指定,,常用@@@,###

    s前面加執行范圍,%表示全部  ,可寫數字圈定范圍

    替換標記

    g:全局替換

    w /PATH/TO/SOMMEFILE:將替換成功的行保存至指定文件中

     p:顯示替換成功的行

    練習:

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

      [root@wen-7 ~]# sed 's@^[[:space:]]\+@@ ' /boot/grub2/grub.cf

        刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#后面的所有空白字符

      [root@wen-7 ~]# sed 's@^#[[:space:]]*@@' /etc/fstab

        輸出一個絕對路徑給sed,去除其目錄,其行為類似于dirname;

      [root@wen-7 tmp]# echo "/etc/passwd" | sed  's@^.*\<@@'
      passwd

 高級編輯命令

    h:把模式空間中的內容覆蓋至保持空間中

    H:把模式空間中的內容追加至保持空間中

    g:把保持空間中的內容覆蓋至模式空間中

    G:把保持空間中的內容追加至模式空間中

    x:把模式空間與保持空間中的內容互換

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

    N:追加讀取匹配到的行的下一行至模式空間中,原文后追加

    d:刪除模式空間中的行

    D:刪除多行模式空間中的所有行;

實例:  

     sed -n ‘n;p’ FILE:顯示偶數行 (第一行匹配,第二行把第一行覆蓋輸出,(第三行匹配,第四行把第三行覆蓋輸出)

     sed '1!G;h;$!d' FILE:逆序顯示文件的內容 ()

     sed -n '1!G;h;$p' FILE :逆序顯示文件

     sed ‘$!d’ FILE:取出文件的最后一行

     sed ‘$!N;$!D’ FILE:取出文件最后兩行

     sed ‘/^$/d;G' FILE :刪除原有的空白行,在所有非空白行后添加一個空白行

     sed ‘n;d’ FILE :顯示奇數行

練習:

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

     [root@wen-7 base]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg 
     elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
     source $prefix/custom.cfg;
     fi
     ### END /etc/grub.d/41_custom ###

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

     [root@wen-7 base]# sed  's@^#[[:space:]]*@@g' /etc/fstab 
     /etc/fstab
     Created by anaconda on Tue Jul 19 18:59:02 2016
     Accessible filesystems, by reference, are maintained under '/dev/disk'

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

     A .[root@wen-7 base]# sed -n 's@^@#@gp' /root/.bash_logout 
       ## ~/.bash_logout
       #
     B. [root@wen-7 ~]# sed 's@^@&#@' /root/install.log

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

     [root@wen-7 base]# sed  -n 's@^[^#]@&#@gp' /etc/fstab     
     #dev/mapper/centos-root /                       xfs     defaults        0 0
     #UID=d9988fae-8ee0-434e-9caa-bd3bd20324a3 /boot                   xfs     defaults        0 0
     #dev/mapper/centos-swap swap                    swap    defaults        0 0

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

     目錄名: 

     A root@wen-7 base]# echo "/etc/fstab" | sed 's@[^/]\+$@@g'
     B [root@wen-7 ~]# echo "/etc/issue"| sed 's@[^/]\+$@@' 
     C echo "/etc/issue"| sed -r 's@(.*/)([^/]+/)$@ /1@'
     D  [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'

    基名:

     A  [root@wen-7 ~]# echo "/etc/issue"|sed 's@^.*\<@@'
     B  [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\2@
     C  [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'

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

    centos6.8:  [root@wen-6 ~]# ifconfig|sed -n 2p |sed -r  's/.*addr:(.*)  Bca.*/\1/'            
                      172.18.19.210
    centos7.2:  [root@wen-7 tmp]# ifconfig|sed -n 2p |sed -r  's/.*inet(.*)  netmask.*/\1/'
                     172.18.19.219

    

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

  A [root@wen-7 ~]# ls /mnt/base/*.rpm  |  sed -r 's@.*\.([^.]+)\.rpm$@\1@'|sort| uniq -c
   1524 i686
   1416 noarch
   3578 x86_64
   
  B ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c

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

(0)
wencxwencx
上一篇 2016-08-10 10:15
下一篇 2016-08-10 10:22

相關推薦

  • 馬哥教育網絡班21期-第九周課程練習

    第九周作業 1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # declare -i nologin=0 declare -i other=0   &n…

    Linux干貨 2016-09-19
  • N25_第五周

    1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;grep -E "^[[:space:]]+" /boot/grub2/grub.cfg 2、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;grep -E "^#[[:space:]…

    Linux干貨 2017-01-08
  • TCP/IP五層模型

    1、簡述osi七層模型和TCP/IP五層模型 網絡的七層模型是由OSI和CITT一起制定的開放系統互連參考模型: TCP/IP 五層模型可以分為:應用層,傳輸層,網絡層,數據鏈路層,物理層。 2、簡述ip route家族命令 語法:ip [ OPTIONS ] OBJECT { COMMAND | help } OBJECT={link ,addr,rout…

    2018-01-05
  • Linux find命令使用詳則

    find命令 find命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄欲文件。并且將查找到的子目錄和文件全部進行顯示。 語法 find(選項)(參數) 選項 -amin<分鐘>:查找在指定時間曾被存取過的文件或者目錄,單位以分鐘計算; -ane…

    2017-08-03
  • 2016/08/11:初涉shell腳本編程

    感悟 :    經過對文本處理工具grep,sed等內容的,以及vim文本編輯器的學習,馬不停蹄的又進行了對shell腳本的學習。對shell腳本的認識是可以保存在本地,用的時候只要執行相關腳本,簡短的命令就可以完成操作,可以用來應對日常重復性工作,有效提高系統管理員的效率,避免在重復性工作上花費不必要的時間。 *************…

    Linux干貨 2016-08-16
  • Bash的&&,||邏輯運算

    Bash的&&,||邏輯運算 bash里的true和false并不是我們通常所認為的0和1。 true和false是shell的內置命令,返回邏輯值。 $?是一個特殊的變量,存放有上一個程序的結束狀態。 在shell里面,把0作為程序是否成功結束的標志。 例如: $ true$ echo$?0$ false$ echo$?1 有時候,下一條命…

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