1. 程式人生 > >LINUX 之 SED 使用

LINUX 之 SED 使用

Sed是Stream Editor(流編輯器)縮寫,是操作、過濾和轉換文字內容的強大工具。常用功能有增刪改查,過濾,取行。

  1. [[email protected] ~]# sed --version #→ sed軟體版本
  2. GNU sed version 4.2.1

語法格式

  1. sed [options] [sed-commands] [input-file]
  2. sed [選項] [sed命令] [輸入檔案]
  3. 說明:
  4. 1. 注意sed和後面的選項之間至少有一個空格。
  5. 2. 為了避免混淆,本文稱呼sed為sed軟體。sed-commands(sed命令)是sed軟體內建的一些命令選項,為了和前面的options(選項)區分,故稱為sed命令。
  6. 3. sed-commands既可以是單個sed命令,也可以是多個sed命令組合。
  7. 4. input-file(輸入檔案)是可選項,sed還能夠從標準輸入如管道獲取輸入。

命令執行流程

概括流程:Sed軟體從檔案或管道中讀取一行,處理一行,輸出一行;再讀取一行,再處理一行,再輸出一行……

模式空間:sed軟體內部的一個臨時快取,用於存放讀取到的內容。

使用範例

1. 統一實驗文字

  1. # 建立包含下面內容的檔案,後面的操作都會使用這個檔案。
  2. [[email protected] ~]# cat person.txt
  3. 101,oldboy,CEO
  4. 102,zhangyao,CTO
  5. 103,Alex,COO
  6. 104,yy,CFO
  7. 105,feixue,CIO

2. 增刪改查

2.1 增

  • a 追加文字到指定行後
  • i 插入文字到指定行前
2.1.1 單行增加
  1. [[email protected] ~]# sed '2a 106,dandan,CSO' person.txt
  2. 101,oldboy,CEO
  3. 102,zhangyao,CTO
  4. 106,dandan,CSO
  5. 103,Alex,COO
  6. 104,yy,CFO
  7. 105,feixue,CIO
  8. [[email protected] ~]# sed '2i 106,dandan,CSO' person.txt
  9. 101,oldboy,CEO
  10. 106,dandan,CSO
  11. 102,zhangyao,CTO
  12. 103,Alex,COO
  13. 104,yy,CFO
  14. 105,feixue,CIO
2.1.2 多行增加
  1. [[email protected] ~]# sed '2a 106,dandan,CSO\n107,bingbing,CCO' person.txt
  2. 101,oldboy,CEO
  3. 102,zhangyao,CTO
  4. 106,dandan,CSO #→第1種寫法
  5. 107,bingbing,CCO
  6. 103,Alex,COO
  7. 104,yy,CFO
  8. 105,feixue,CIO
  9. [[email protected] ~]# sed '2a 106,dandan,CSO \
  10. > 107,bingbing,CCO' person.txt
  11. 101,oldboy,CEO
  12. 102,zhangyao,CTO
  13. 106,dandan,CSO #→第2種寫法
  14. 107,bingbing,CCO
  15. 103,Alex,COO
  16. 104,yy,CFO
  17. 105,feixue,CIO
  18. #→sed命令i的使用方法是一樣的,因此不再列出。
企業案例1:優化SSH配置(一鍵完成增加若干引數)

在我們學習系統優化時,有一個優化點:更改ssh服務遠端登入的配置。主要的操作是在ssh的配置檔案加入下面5行文字。(下面引數的具體含義見其他課程。)

  1. Port 52113
  2. PermitRootLogin no
  3. PermitEmptyPasswords no
  4. UseDNS no
  5. GSSAPIAuthentication no

我們可以使用vi命令編輯這個文字,但這樣就比較麻煩,現在想一條命令增加5行文字到第13行前?

指定執行的地址範圍

  1. sed軟體可以對單行或多行進行處理。如果在sed命令前面不指定地址範圍,那麼預設會匹配所有行。
  2. 用法:n1[,n2]{sed-commands}
  3. 地址用逗號分隔的,n1,n2可以用數字、正則表示式、或二者的組合表示。
  4. 例子:
  5.    10{sed-commands} 對第10行操作
  6.    10,20{sed-commands} 對10到20行操作,包括第10,20行
  7.    10,+20{sed-commands} 對10到30(10+20)行操作,包括第10,30行
  8.    1~2{sed-commands} 對1,3,5,7,……行操作
  9.    10,${sed-commands} 對10到最後一行($代表最後一行)操作,包括第10行
  10. /oldboy/{sed-commands} 對匹配oldboy的行操作
  11. /oldboy/,/Alex/{sed-commands} 對匹配oldboy的行到匹配Alex的行操作
  12. /oldboy/,${sed-commands} 對匹配oldboy的行到最後一行操作
  13. /oldboy/,10{sed-commands} 對匹配oldboy的行到第10行操作,注意:如果前10行沒有匹配到oldboy,sed軟體會顯示10行以後的匹配oldboy的行,如果有。
  14. 1,/Alex/{sed-commands} 對第1行到匹配Alex的行操作
  15. /oldboy/,+2{sed-commands} 對匹配oldboy的行到其後的2行操作

2.2 刪

d 刪除指定的行

  1. [[email protected] ~]# sed 'd' person.txt
  2. [[email protected] ~]#
  3. [[email protected] ~]# sed '2d' person.txt
  4. 101,oldboy,CEO
  5. 103,Alex,COO
  6. 104,yy,CFO
  7. 105,feixue,CIO
  8. [[email protected] ~]# sed '2,5d' person.txt
  9. 101,oldboy,CEO
  10. [[email protected] ~]# sed '3,$d' person.txt
  11. 101,oldboy,CEO
  12. 102,zhangyao,CTO
  13. [[email protected] ~]# sed '1~2d' person.txt
  14. 102,zhangyao,CTO
  15. 104,yy,CFO
  16. [[email protected] ~]# sed '1,+2d' person.txt
  17. 104,yy,CFO
  18. 105,feixue,CIO
  19. [[email protected] ~]# sed '/zhangyao/d' person.txt
  20. 101,oldboy,CEO
  21. 103,Alex,COO
  22. 104,yy,CFO
  23. 105,feixue,CIO
  24. [[email protected] ~]# sed '/oldboy/,/Alex/d' person.txt
  25. 104,yy,CFO
  26. 105,feixue,CIO
  27. [[email protected] ~]# sed '/oldboy/,3d' person.txt
  28. 104,yy,CFO
  29. 105,feixue,CIO
企業案例2:列印檔案內容但不包含oldboy
  1. [[email protected] ~]# sed '/oldboy/d' person.txt #→刪除包含"oldboy"的行
  2. 102,zhangyao,CTO
  3. 103,Alex,COO
  4. 104,yy,CFO
  5. 105,feixue,CIO

2.3 改

2.3.1 按行替換

c 用新行取代舊行

  1. [[email protected] ~]# sed '2c 106,dandan,CSO' person.txt
  2. 101,oldboy,CEO
  3. 106,dandan,CSO
  4. 103,Alex,COO
  5. 104,yy,CFO
  6. 105,feixue,CIO
2.3.2 文字替換

s:單獨使用→將每一行中第一處匹配的字串進行替換 ==>sed命令 
g:每一行進行全部替換 ==>sed命令s的替換標誌之一,非sed命令 
-i:修改檔案內容 ==>sed軟體的選項

sed軟體替換模型(方框▇被替換成三角▲)

sed -i 's/▇/▲/g' oldboy.log 
sed -i 's#▇#▲#g' oldboy.log

觀察特點

  1. 兩邊是引號,引號裡面的兩邊分別為sg,中間是三個一樣的字元/#作為定界符。#能在替換內容包含/有助於區別。定界符可以是任意符號如:|等,但當替換內容包含定界符時,需轉義即: |。經過長期實踐,建議大家使用#作為定界符。
  2. 定界符/#,第一個和第二個之間的就是被替換的內容,第二個和第三個之間的就是替換後的內容。
  3. s#▇#▲#g,▇能用正則表示式,但▲不能用,必須是具體的。
  4. 預設sed軟體是對模式空間(記憶體中的資料)操作,而-i選項會更改磁碟上的檔案內容。
  1. [[email protected] ~]# sed 's#zhangyao#oldboyedu#g' person.txt
  2. 101,oldboy,CEO
  3. 102,oldboyedu,CTO
  4. 103,Alex,COO
  5. 104,yy,CFO
  6. 105,feixue,CIO
  7. [[email protected] ~]# cat person.txt
  8. 101,oldboy,CEO
  9. 102,zhangyao,CTO
  10. 103,Alex,COO
  11. 104,yy,CFO
  12. 105,feixue,CIO
  13. [[email protected] ~]# sed -i 's#zhangyao#BBB#g' person.txt
  14. [[email protected] ~]# cat person.txt
  15. 101,oldboy,CEO
  16. 102,BBB,CTO
  17. 103,Alex,COO
  18. 104,yy,CFO
  19. 105,feixue,CIO
  20. [[email protected] ~]# sed -i 's#oldboyedu#zhangyao#g' person.txt #→還原測試檔案
企業案例3:指定行修改配置檔案

指定行精確修改配置檔案,這樣可以防止修改多了地方。

  1. [[email protected] ~]# sed '3s#0#9#' person.txt
  2. 101,oldboy,CEO
  3. 102,zhangyao,CTO
  4. 193,Alex,COO
  5. 104,yy,CFO
  6. 105,feixue,CIO
2.3.3 變數替換
  1. [[email protected] ~]# cat test.txt #→再新建一個文字
  2. a
  3. b
  4. a
  5. [[email protected] ~]# x=a
  6. [[email protected] ~]# y=b
  7. [[email protected] ~]# echo $x $y
  8. a b
  9. [[email protected] ~]# sed s#$x#$y#g test.txt
  10. b
  11. b
  12. b
  13. [[email protected] ~]# sed 's#$x#$y#g' test.txt
  14. a
  15. b
  16. a
  17. [[email protected] ~]# sed 's#'$x'#'$y'#g' test.txt
  18. b
  19. b
  20. b
  21. [[email protected] ~]# sed "s#$x#$y#g" test.txt
  22. b
  23. b
  24. b
  25. [[email protected] ~]# eval sed 's#$x#$y#g' test.txt
  26. b
  27. b
  28. b
2.3.4 分組替換\( \)\1的使用說明

sed軟體的\( \)的功能可以記住正則表示式的一部分,其中,\1為第一個記住的模式即第一個小括號中的匹配內容,\2第二記住的模式,即第二個小括號中的匹配內容,sed最多可以記住9個。

例:echo I am oldboy teacher.如果想保留這一行的單詞oldboy,刪除剩下的部分,使用圓括號標記想保留的部分。

  1. [[email protected] ~]# echo I am oldboy teacher. |sed 's#^.*am \([a-z].*\) tea.*$#\1#g'
  2. oldboy
  3. [[email protected] ~]# echo I am oldboy teacher. |sed -r 's#^.*am ([a-z].*) tea.*$#\1#g'
  4. oldboy
  5. [[email protected] ~]# echo I am oldboy teacher. |sed -r 's#I (.*) (.*) teacher.#\1\2#g'
  6. amoldboy

命令說明

思路:用oldboy字元替換I am oldboy teacher.

下面解釋用代替空格

  1. ^.*am□ –>這句的意思是以任意字元開頭到am□為止,匹配檔案中的I am□字串;
  2. \([a-z].*\)□–>這句的外殼就是括號\(\),裡面的[a-z]表示匹配26個字母的任何一個,[a-z].*合起來就是匹配任意多個字元,本題來說就是匹配oldboy字串,由於oldboy字串是需要保留的,因此用括號括起來匹配,後面通過\1來取oldboy字串。
  3. □tea.*$–>表示以空格tea起始,任意字元結尾,實際就是匹配oldboy字串後,緊接著的字串□teacher.;
  4. 後面被替換的內容中的\1就是取前面的括號裡的內容了,也就是我們要的oldboy字串。
  5. ()是擴充套件正則表示式的元字元,sed軟體預設識別基本正則表示式,想要使用擴充套件正則需要使用\轉義,即\(\)。sed使用-r選項則可以識別擴充套件正則表示式,此時使用\(\)反而會出錯。
企業案例4:系統開機啟動項優化
  1. [[email protected] ~]# chkconfig --list|grep "3:on"|grep -vE "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}'|sed -r 's#^(.*)#chkconfig \1 off#g'|bash
  2. [[email protected] ~]# chkconfig --list|grep "3:on"
  3. crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  4. network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  5. rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  6. sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  7. sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off
2.3.5 特殊符號&代表被替換的內容
  1. [[email protected] ~]# sed '1,3s#C#--&--#g' person.txt #→此處&等於C
  2. 101,oldboy,--C--EO #→將1到3行的C替換為--C--
  3. 102,zhangyao,--C--TO
  4. 103,yy,--C--OO
  5. 104,feixue,CFO
  6. 105,dandan,CIO
企業案例5:批量重新命名檔案

當前目錄下有檔案如下所示:

  1. [[email protected] test]# ls
  2. stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg stu_102999_5_finished.jpg

要求用sed命令重新命名,效果為stu_102999_1_finished.jpg==>stu_102999_1.jpg,即刪除檔名的_finished

2.4 查

p 輸出指定內容,但預設會輸出2次匹配的結果,因此使用n取消預設輸出

2.4.1 按行查詢
  1. [[email protected] ~]# sed '2p' person.txt
  2. 101,oldboy,CEO
  3. 102,zhangyao,CTO
  4. 102,zhangyao,CTO
  5. 103,Alex,COO
  6. 104,yy,CFO
  7. 105,feixue,CIO
  8. [[email protected] ~]# sed -n '2p' person.txt
  9. 102,zhangyao,CTO
  10. [[email protected] ~]# sed -n '2,3p' person.txt
  11. 102,zhangyao,CTO
  12. 103,Alex,COO
  13. 說明:取行就用sed,最簡單
  14. [[email protected] ~]# sed -n '1~2p' person.txt
  15. 101,oldboy,CEO
  16. 103,Alex,COO
  17. 105,feixue,CIO
  18. [[email protected] ~]# sed -n 'p' person.txt
  19. 101,oldboy,CEO
  20. 102,zhangyao,CTO
  21. 103,yy,COO
  22. 104,feixue,CFO
  23. 105,dandan,CIO
2.4.2 按字串查詢
  1. [[email protected] ~]# sed -n '/CTO/p' person.txt
  2. 102,zhangyao,CTO
  3. [[email protected] ~]# sed -n '/CTO/,/CFO/p' person.txt
  4. 102,zhangyao,CTO
  5. 103,Alex,COO
  6. 104,yy,CFO
2.4.3 混合查詢
  1. [[email protected] ~]# sed -n '2,/CFO/p' person.txt
  2. 102,zhangyao,CTO
  3. 103,Alex,COO
  4. 104,yy,CFO
  5. [[email protected] ~]# sed -n '/feixue/,2p' person.txt
  6. 105,feixue,CIO
  7. 相關推薦

    linuxsed用法

    sil 資料 log sed的用法 單位 welcome 數據 讀取 local sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法 sed命令行格式為:

    【轉載】linuxsed用法

    span 變量 常用 tdi 選擇 包括 div 輸入 記得 linux之sed用法 原文地址:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一個很好的文件處理工具,本身是

    謝煙客---------Linux sed工具使用

    linuxsed Stream EDitor 文本流編輯器, 行編輯器sed工作方式 sed基本使用格式一:sed [OPTION ...] [SCRIPT] [FILE...] 多個文件處理: 處理完一個,繼續處理第二個。 sed script file1 --> sed script fil

    LINUX sed用法

    sed用法 Linux sed命令是利用script來處理文本文件 sed可依照script的指令,來處理、編輯文本文件 sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等 語法 sed [-hnV][-e<script>][-

    Linux sed 與 find 命令結合使用

    sedsed 與 find 命令結合使用 目的:把/root/kang目錄下,所有帶有*.sh結尾的文件,並且內容oldboy的字符串,替換成kang [root@localhost kang]# find /root/kang/ -type f -name "*.sh"|xargs /root/kang/

    Linux sed 實例詳解

    sedsed 實例詳解 文本內容: 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 1.sed 增加內容 -a 往文本或號後面增加內容 -i 往行號前增加內容 -a 實例:在A

    玩轉LINUXsed命令詳解

    用戶 常見 mail 括號 {} int 緩沖 復雜 commands Linux sed命令是利用script來處理文本文件。 sed可依照script的指令,來處理、編輯文本文件。 Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。 執行時,s

    Linuxsed命令詳解

    sed是一種流編輯器,它是文字處理中非常好的工具,能夠完美的配合正則表示式使用,功能不同凡響。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,

    Linuxsed命令常見用法

    cron 更改 inux api lin sed命令 -s 輸出 syslog 1. sed(stream editor),流編輯器   linux中,主要中sed命令實現對文件的增刪改替換查 名稱 sed - 用於過濾和轉換文本的流編輯

    LINUX SED 使用

    Sed是Stream Editor(流編輯器)縮寫,是操作、過濾和轉換文字內容的強大工具。常用功能有增刪改查,過濾,取行。 [[email protected] ~]# sed --version #→ sed軟體版本GNU sed version 4.2.1 語法格式 sed [options

    Linux下常用命令sed學習總結

    linux sed sed命令 正則表達式 sed總結 Sed功能說明:Sed是linux下一個強大的文本文件處理工具,通過對文件增加、刪除、查找、查詢操作,配合正則表達式以實現工作中的各種需求。同時也是一名運維人員必須掌握的核心技能。---------------------------

    Linux命令簡單操作sed

    es2017 字符串 選項 常用 images sed 匹配 lena options sed sed語法格式: sed[options ]‘command’ file(s) sed常用選項: -n:只有經過sed 特殊處理的那一行(或者動作)才會被列出來

    Linux】基礎每日一命sed命令

    標準 tin .... ddr 一行 inet6 修改文件 方法 兩個 sed命令是利用script來處理文件 sed可依照script的指令,來處理、編輯文本文件。sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等 語法:sed [-hnV][-e

    Linux學習總結(二十)正則三劍客sed

    sedsed 流式編輯器,針對文檔的行來操作的 一 查找打印 1.打印某行格式: sed -n ‘n‘p filename 單引號內的n代表數字,表示第幾行例如:打印第二行sed -n ‘2‘p /etc/passwd也可以指定區間,比如打印前三行sed -n‘1,3‘p /etc/passwd打印所有的行s

    Linux常用命令sed

    UC perm wid cross 每次 orm separate 當前 命令操作 sed NAME sed - stream editor for filtering and transforming text 文本流編輯,sed是一個“非交互式的”面向字符流的編輯器

    Linux常用命令sed(2)

    代碼 並不會 獨立 command 不存在 chan posix 通用 示例 Sed SED的英文全稱是 Stream EDitor,它是一個簡單而強大的文本解析轉換工具,在1973-1974年期間由貝爾實驗室的Lee E. McMahon開發,今天,它已經運行在所有的

    Linux 文本查看命令sed

    Linux 文本查看命令之sed的簡單操Stream Editor 流編輯器 做行處理的默認不直接編輯原文件,在內存中進行處理(但是會整篇處理),臨時存放的空間叫做pattern space(模式空間)。如果可以被關鍵字匹配,然後就進行編輯(編輯完成後,可以將新的內容放入hold space,保持空間),如果

    Linux 文本操作sed

    linux sedsed強大的文本處理工具,其工作流程大概如下 常用選項說明 -e<script>或--expression=<script> 以選項中指定的script來處理輸入的文本文件。-f<script文件>或--file=<script文件> 以選項

    linux三劍客sed入門詳解

    linux 三劍客 sed sed介紹sed流編輯器(stream editor),在三劍客中排行老二,是一款簡單的文本編輯語言。sed並不直接處理源文件,而是逐行讀取源文件的內容到內存(稱模式空間)中,然後在模式空間中使用sed命令處理,再打印模式空間處理後的內容到標準輸出。sed的能夠實現的功

    linux三劍客sed模式空間與保持空間

    linux sed 三劍客 模式空間 保持空間 pattern space(模式空間) and hold space (保持空間)(H、h、G、g、x)模式空間:sed處理文本內容行的一個臨時緩沖區,模式空間中的內容會主動打印到標準輸出,並自動清空模式空間 保持空間:sed處理文本內容行的