sed命令解析

處理文件的工具sed


Stream EDitor, 行編輯器
一次只讀一行,只處理一行,不對源文件做處理,至輸出到屏幕上模式空間

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

用法:
    sed[option]... 'script' inputfile...

常用選項:
    -n: 靜默模式,不輸出模式空間中的內容;
    -n, --quiet, --silent
          suppress automatic printing of pattern space
    -r: 擴展的正則表達式
    -r, --regexp-extended
          use extended regular expressions in the script.     
    -f /path/to/sed_script_file: 指定sed腳本文件
    -f script-file, --file=script-file
          add the contents of script-file to the commands to be executed
    -e 'script' -e 'script': 指定多個編輯指令
    -e script, --expression=script
          add the script to the commands to be executed
    -i: 直接編輯原文件
          edit files in place

script:
    '地址命令'

編輯命令:
    d: 刪除
    p: 打印
    i \text: \n 換行符   行前面插入文本
    a \text: \n 換行符   行下面插入文本
    r /path/to/somefile: 在指定位置把另外一個文件的內容插入進來
    w /path/to/somefile:將符合條件的所有行保存至指定的文件中
    =:顯示符合條件的行的行號
    s///: 查找條件可以使用模式,但要替換的內容不行
        ///可以替換為@@@或者###或者$$$
        g:行內全局替換
        p:顯示替換成功的行
        w /path/to/somefile:將替換成功的行保存至文件中
    !:模式空間中匹配行取反處理

地址定界
(1) 不給地址:對全文進行處理
(2) 單地址:
    #: 指定的行
    /pattern/:被此處模式所能夠匹配到的每一行
(3) 地址范圍:
    #,#
    #,+#
    /pat1/,/pat2/
    #,/pat1/
(4) ~:步進
    1~2 奇數行
    2~2 偶數行
    
用法
    #sed [options] 'addr1[,addr2]編輯命令' FILE ...
    #sed [options] “addr1[,addr2]編輯命令” FILE ...

[root@centos7 tmp]# cat f1 /etc/passwd | head -5
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@centos7 tmp]# sed '2p' f1 | head -5
###2p  即打印第二行
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 tmp]# sed -n '2p' f1 
###-n 不輸出模式空間中的內容;注意看和上面的區別
     2	bin:x:1:1:bin:/bin:/sbin/nologin
[root@centos7 tmp]# sed -n '1,4p' f1 
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 tmp]# sed -n '/root/p' f1
###包含root字符串的行輸出出來
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
    10	operator:x:11:0:operator:/root:/sbin/nologin
    49	rooter:x:0:5009::/home/rooter:/bin/bash
[root@centos7 tmp]# cat -n f2
     1	1
     2	
     3	2
     4	
     5	
     6	3
     7	
  
[root@centos7 tmp]# sed -n '/^$/=' f2
###輸出空行的行號 結合上面的cat命令可以看出效果
2
4
5
7
[root@centos7 tmp]# sed -n -e '/^$/p' -e '/^$/=' f2
###-e指定多個編輯命令

2

4

5

7
[root@centos7 tmp]# sed '/^$/d' f2
1
2
3
[root@centos7 tmp]# sed '1,10d' f1 | head -5
    11	games:x:12:100:games:/usr/games:/sbin/nologin
    12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13	nobody:x:99:99:Nobody:/:/sbin/nologin
    14	systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    15	systemd-network:x:998:997:systemd Network Management:/:/sbin/nologin
[root@centos7 tmp]# sed -n 's/root/&superman/p' /etc/passwd
rootsuperman:x:0:0:Sxj,001,002,003:/root:/bin/bash
operator:x:11:0:operator:/rootsuperman:/sbin/nologin
rootsupermaner:x:0:5009::/home/rooter:/bin/bash
[root@centos7 tmp]# sed -i.bak 's/root/superman/g' f1
###會直接修改文件f1 同時生成備份文件f1.bak  f1.bak為修改前的內容

[root@centos7 tmp]# cat /etc/fstab | sed  -e 's@UUID@ABC@g' -e 's@ABC@DEF@g'
###

DEF=174a1f45-937a-4844-9650-27550836880d /                       ext4    defaults        1 1
DEF=a9778fb4-3adb-471b-96ff-571d2325ee3c /boot                   ext4    defaults        1 2
DEF=fb15ae62-3c30-4cbb-9d4e-a0e3e2531e8c /testdir                ext4    defaults        1 2
DEF=ba38f744-eb07-4306-b0a0-9b58a9ba81f2 swap                    swap    defaults        0 0

[root@centos7 tmp]# cat /etc/fstab | sed  -e 's@UUID@ABC@g' -e 's@UUID@DEF@g'
###和上一個做比較,可以看出第二個-e后的編輯命令是處理第一個-e處理之后的結果

ABC=174a1f45-937a-4844-9650-27550836880d /                       ext4    defaults        1 1
ABC=a9778fb4-3adb-471b-96ff-571d2325ee3c /boot                   ext4    defaults        1 2
ABC=fb15ae62-3c30-4cbb-9d4e-a0e3e2531e8c /testdir                ext4    defaults        1 2
ABC=ba38f744-eb07-4306-b0a0-9b58a9ba81f2 swap                    swap    defaults        0 0

高級編輯命令:
    h: 把模式空間中的內容覆蓋至保持空間中
    H:把模式空間中的內容追加至保持空間中
    g: 從保持空間取出數據覆蓋至模式空間
    G:從保持空間取出內容追加至模式空間
    x: 把模式空間中的內容與保持空間中的內容進行互換
    n: 讀取匹配到的行的下一行覆蓋至模式空間
    N:追加匹配到的行的下一行至模式空間
    d: 刪除模式空間中的行
    D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),
       放棄之后的命令,但是對剩余模式空間重新執行sed

sed命令解析

下面用幾個實例來說明sed的高級用法:

# sed -n 'n;p' /etc/fstab 顯示偶數行
# sed '1!G;h;$!d' FILE 逆序顯示文件內容
# sed '$!d' FILE  取出最后一行
# sed '$!N;$!D' FILE  取出文件后兩行;
# sed '/^$/d;G' FILE 刪除原有的所有空白行,而后為所有非空白行添加一個空白行
# sed 'n;d' FILE 顯示奇數行
# sed 'G' FILE 在原有的每行后方添加一個空白行

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

(0)
sixijiesixijie
上一篇 2016-08-11 09:38
下一篇 2016-08-11 11:28

相關推薦

  • 26期全程班-第三周博客作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。     # who | cut -d” ” -f 1 | sort -u   2、取出最后登錄到當前系統的用戶的相關信息。     # id `last …

    Linux干貨 2017-02-18
  • 馬哥教育網絡班20期+第2周課程練習

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 常用文件管理命令有:ls、mkdir、cd、pwd、cp、rm、mv、touch、cat、more、less、head、tail等 (1)ls命令:列出目錄內容 ls [OPTION]… [FILE]…  &nbs…

    Linux干貨 2016-06-29
  • 運籌帷幄之中,決勝與千里之外!

    ? ? ? ?運籌帷幄之中,決勝與千里之外,決定改變一生。 ? ? ? ?自從2016年年后學校要求產參加畢業實習,但對linux一竅不通的我,陰差陽錯的被一家網絡公司給錄取了。 ? ? ? ?安排在一家企業做駐場運維工程師,剛去駐場的時候并沒有給我分配相應的工作只是給了一些關于數據庫,網絡,和系統的一些資料,要求進行自學。我想了想,就決定選擇了系統進行了解…

    2018-03-26
  • CentOS7下利用rsyslog+loganalyzer配置日志服務器及Linux和windows客戶端配置

    隨著機房內的服務器和網絡設備增加,日志管理和查詢就成了讓系統管理員頭疼的事。 系統管理員遇到的常見問題如下: 1、日常維護過程中不可能登錄到每一臺服務器和設備上去查看日志; 2、網絡設備上的存儲空間有限,不可能存儲日期太長的日志,而系統出現問題又有可能是很久以前發生的某些操作造成的; 3、在某些非法入侵的情況下,入侵者一般都會清除本地日志…

    2017-03-15
  • 設計模式(六)橋連模式Bridge(結構型)

    1. 概述       在軟件系統中,某些類型由于自身的邏輯,它具有兩個或多個維度的變化,那么如何應對這種“多維度的變化”?如何利用面向對象的技術來使得該類型能夠輕松的沿著多個方向進行變化,而又不引入額外的復雜度? 例子1:設想如果要繪制矩形、圓形、橢圓、正方形,我們至少需要4個形狀類,但是如果繪制的圖形需要具有不同的…

    Linux干貨 2015-06-26
  • N25-第十三周博客作業

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

    Linux干貨 2017-04-19
欧美性久久久久