linux sed命令

linux sed命令

簡介:

sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern
space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有
改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。

補充:提取某一行中的內容而用sed 匹配時,一定要先匹配到那一行后然后用后向引用把那一行中的所去的內容用反向引用 \1 或者 & **把它提取出來

用法:

            sed [option]…    ' script '    inputfile…

常用選項:

  • -n:不輸出模式空間內容的自動打印

  • -e: 多點編輯

  • -f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本

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

  • -i: 原處編輯

script:

'  地址命令  '

地址定界
(1) 不給地址:對全文進行處理
(2) 單地址:

 #: 指定的行
 /pattern/:被此處模式所能夠匹配到的每一行

(3) 地址范圍:

 #,#
 #,+#
/pat1/,/pat2/
#,/pat1/

(4) ~:步進

     1~2 奇數行(顯示奇數行)
     2~2 偶數行(顯示偶數行)

記?。簡我?#039; ' 里面的是地址命令,要加地址范圍 / /才能匹配

編輯命令:

d:   刪除模式空間匹配的行**p:   顯示模式空間中的內容**a \text: 在行后面追加文本;支持使用\n實現多行追加**i \text: 在行前面插入文本;支持使用\n實現多行插入**c \text: 替換行為單行或多行文本**w /path/to/somefile:    保存模式匹配的行至指定文件**r /path/from/somefile:  讀取指定文件的文本至模式空間中匹配到的行后**=:   為模式空間中的行打印行號**!:   模式空間中匹配行取反處理**

s///:查找替換,支持使用其它分隔符,s@@@,s###

替換標記:

    如果不加 就說明只  替換每行的第一個匹配到的內容
    g: 行內全局替換
    p: 顯示替換成功的行
    w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中

其中&表示 /1/&/ 這里的&就是1的內容

    在aaa后面添加字段:sed -ne 's/aaa/HELLO&/p' test 
    輸出結果:HELLOaaa
    在前后同時添加:sed -ne 's/aaa/&HELLO&/p' test 
    輸出結果:aaaHELLOaaa
    以行為單位的新增/刪除

這種只是行內操作

練習

1、將 /etc/passwd 的內容列出并且列印行號,同時,請將第 2~5 行刪除!

    [root@www ~]# nl /etc/passwd | sed '2,5d'
    1 root:x:0:0:root:/root:/bin/bash
    6 sync:x:5:0:sync:/sbin:/bin/sync
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

2、僅列出 /etc/passwd 文件內的第 5-7 行

[root@www ~]# nl /etc/passwd | sed -n '5,7p'
5 lop:x:4:7:lop:/var/spool/lopd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

3、多點編輯:一條sed命令,刪除/etc/passwd第三行到末尾的數據,并把bash替換為sheller

nl /etc/passwd | sed -e '3,$d' -e 's/bash/sheller/'
1  root:x:0:0:root:/root:/bin/sheller
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

4、從某行到某行的打印

sed -n '/^root/,/^s/p' /etc/passwd

*后向引用的用法,匹配等用法:

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

[root@qzx tmp]# sed 's@^[[:space:]]+@@' /etc/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that

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

[root@qzx tmp]# sed  's@^#[[:space:]]\+@@' /etc/fstab

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

#Installing ipw2200-firmware-3.1-4.el6.noarch
#Installing rootfiles-8.1-6.1.el6.noarch
#Installing man-pages-3.22-20.el6.noarch
#Installing words-3.0-17.el6.noarch
#*** FINISHED INSTALLING PACKAGES ***[root@qzx tmp]# ^C
[root@qzx tmp]# sed 's$^$#$' /root/install.log

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

[root@qzx tmp]# sed  's@^#[[:space:]]\+@@' /etc/fstab

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

[root@qzx tmp]# echo /etc/init/rc.conf/ | sed -r 's@.*/([^/]+/?$)@\1@'
rc.conf/
[root@qzx tmp]# echo /etc/init/rc.conf | sed -r 's@.*/([^/]+/?$)@\1@'
rc.conf

路徑名:

[root@qzx tmp]# echo /etc/init/rc.conf | sed -r 's@(.*/)[^/]+/?$@\1@'
 /etc/init/

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

[root@qzx tmp]# ifconfig |sed -n '2p' |sed -r 's@.*addr:(.*)B.*@\1@'
10.1.253.75

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

[root@qzx Packages]# ls *.rpm  |sed -r 's#.*\.(.*)\.rpm#\1#'|sort |uniq -c
      4 i686
    919 noarch
   2283 x86_64

其他高級編輯命令:

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

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

  • g: 從保持空間取出數據覆蓋至模式空間

  • G:從保持空間取出內容追加至模式空間

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

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

  • N:追加匹配到的行的下一行至模式空間

  • d: 刪除模式空間中的行

  • D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
    linux sed命令
    保持空間,一次處理不完保存的地方

    實例

    sed -n 'n;p' FILE
    打印偶數行

    sed '1!G;h;$!d' FILE
    倒序排列行 想到于 tac

    sed '$!N;$!D' FILE
    保留后兩行

    sed '$!d' FILE
    只保留最后一行

    sed ‘G’ FILE
    加空行

    sed ‘g’ FILE
    顯示10個空行

    sed ‘/^$/d;G’ FILE
    刪除多余的空行,并在每行后加一個空行

    sed 'n;d' FILE
    [root@qzx ~]# sed 'n;d' qzx.txt
    1
    3
    5
    7
    9

sed -n '1!G;h;$p' FILE
[root@qzx ~]# sed -n '1!G;h;$p' qzx.txt
10
9
8
7
6
4
5
3
2
1

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

(1)
qzxqzx
上一篇 2016-08-10
下一篇 2016-08-10

相關推薦

  • 馬哥團隊帶你揭秘互聯網巨頭公司—騰訊

    馬哥團隊帶你揭秘互聯網巨頭公司—騰訊 前幾日,馬哥團隊成員受邀,到國內互聯網巨頭–騰訊參觀和交流,并用照片記錄下了一些精彩瞬間,這里分享給大家。(希望大家多多努力,早日進入頂級公司) 剛到騰訊大廈,上到公司門口,是騰訊的前臺,(沒想到前臺是個男同胞) 進來后,騰訊的照片墻,十分有質感 訪客必須先登記,會給發放一個騰訊的訪客門牌。 公司…

    學員作品 2015-04-14
  • ?Linux中的用戶與組

    一、用戶與UID 1.用戶(User)分為管理員與普通用戶 2.對于Linux系統而言,通過UID來界定某用戶是屬于哪個用戶,而不是用戶名 3.查看某用戶的UID可以通過id命令實現,Centos6.8與7.2系統上的UID部分起始數值有所不同 Centos7.2 [root@localhost home]# id root u…

    學員作品 2016-08-10
  • 馬哥linuxYY講師征集令

    馬哥linuxYY講師征集令 有膽你就來   想在馬幫群雄面前一展身手,分享你的工作經驗和感悟嗎?       敢在眾人面前暢所欲言,展現實力,增加個人影響力嗎?       快來加入馬哥教育YY講師團吧,帶上你的分享主…

    2015-09-09
  • linux操作系統rpm軟件包管理

    軟件包管理 軟件包運行環境: API:Application Programming Interface     使用標準:POSIX:     源代碼運行步驟:預處理(如處理注釋)—>編譯成匯編代碼—>鏈接其他庫文件 ABI:applicatio…

    2016-08-22
  • 8月5日課堂及課后作業

    課堂作業 1.找出ifconfig命令結果中的IP地址 [root@localhost ~]# ifconfig |head -2|grep "inet" |tr " " ":"|cut -d:&nb…

    2016-08-08
  • 馬哥教育網絡班20期+第10周博客作業

    4、寫一個腳本   (1) 能接受四個參數:start, stop, restart, status    start: 輸出“starting 腳本名 finished.”    …   (2) 其它任意參數,均報錯退出;     #!bin/b…

    學員作品 2016-12-05
欧美性久久久久