Linux文本處理三劍客之sed命令全面解析,一文就夠了

2020-11-06 雨滴測試

作用

  • sed命令是一個非交互式的行文本編輯器,它能對文件內容進行編輯,默認每次處理文本文件中所匹配到一行內容到模式空間,然後用後面的命令進行操作,操作完成之後,會把模式空間裡面的內容輸出到屏幕上,然後把模式空間中的內容刪除,同時把下一行所匹配到的內容讀入模式空間內,依次循環,直到讀取完整個文件。
  • sed 命令處理的是緩衝區中的內容,其實這裡的緩衝區,就是模式空間

語法

sed語法支持兩種格式,分別是

  • sed [options] 'address command' file
  • sed [options] -f [scripefile] file

對以上的幾個英語字符進行說明:

  • options為選項,其中sed支持的選項會在下面的選項小結說明
  • address : 相當於匹配的條件,會在地址中進行說明
  • command為命令,相當於一個參數,放在地址後面,具體見下面的命令小節說明
  • file :為文本文件

需要說明的是,使用時address和command會挨在一起,中間沒有空格,上面語法中間加空格是為了說明這是兩個部分

以下為sed命令的工作流程圖

選項

這裡的選項就是指sed之後的options,常見的選項具體如下:

-e ,--expression=script 以選項中指定的script參數來處理文本文件,可以指定多個命令-f file,--files=script以文件中的指定的參數來處理文本文件​-n ,--quiet ,--slient取消默認輸出,sed默認會輸出所有文本內容,使用-n參數後只顯示處理過的行​-r ,--regexp-extended支持擴展正則表達式​-i,--in-place[=SUFFIX]直接修改文件內容

地址

這裡的地址就是語法格式中的address部分,是在單引號裡的前一部分 。

替換標記說明linenumber指定特定行號startline,endline指定起始行號和結束行號linenumber,+nn為數字,表示從指定行號向後n行/pattern/已正則表達式表示的匹配模式/pattern1, /pattern2/從模式匹配1到模式匹配2pattern/,x在給定行號上查詢包含模式的行x,/pattern/通過行號和模式查詢匹配的行x,y!查詢不包含指定行號x和y的行

命令

這裡的指令就是command,這個一般放在單引號內,同時和要處理的字符放在一起,只是command放在字符的前面。

a 追加,向匹配行後面插入內容 i 插入,向匹配行前插入內容c 更改,更改匹配行的內容d 刪除,刪除匹配行的內容s 使用替換模式替換相應模式s/patten/newstring 替換,把patten匹配到的內容換成newstringp 列印,列印出匹配的內容,通過與-n選項配合使用= 標號,用來將匹配的行前標號n 讀取下一行,遇到n會自動自動跳入下一行r 將內容讀入文件{} 命令間的傳遞,類似於管道符|w 將匹配內容寫入文件W 將匹配到行的第一行,保存到file中。

替換標記

  • g : 表示將匹配到的內容進行全局替換 。
  • \1 :表示前面第一個左括號所表示的內容 ,\2表示前面第二個左括號中表示的內容,依次類推
  • & : 表示前面匹配到的內容

正則匹配

正在匹配在上面已經介紹到,詳情請見正則表達式介紹。具體見:

實例

以下主要針對地址指令的實戰練習

先準備數據文件aa.txt,通過cat查看aa.txt文件內容

[root@localhost test]# cat aa.txt 總用量 28lrwxrwxrwx.   1 root root     7 9月  10 06:12 bin -> usr/bindr-xr-xr-x.   6 root root  4096 9月  10 06:44 bootdrwxr-xr-x.  20 root root  3360 9月  29 05:19 devdrwxr-xr-x.   3 root root    20 9月  14 03:08 docker_registrydrwxr-xr-x.   2 root root    41 9月  17 06:23 docker_studydrwxr-xr-x. 151 root root 12288 9月  29 05:20 etcdrwxr-xr-x.   3 root root    18 9月  10 06:57 homelrwxrwxrwx.   1 root root     7 9月  10 06:12 lib -> usr/liblrwxrwxrwx.   1 root root     9 9月  10 06:12 lib64 -> usr/lib64drwxr-xr-x.   2 root root     6 4月  11 2018 mediadrwxr-xr-x.   2 root root    21 9月  19 21:51 mntdrwxr-xr-x.   4 root root    34 9月  11 06:53 optdr-xr-xr-x. 307 root root     0 9月  29 05:19 procdr-xr-x---.   7 root root   266 9月  29 05:20 rootdrwxr-xr-x.  45 root root  1320 9月  29 06:26 runlrwxrwxrwx.   1 root root     8 9月  10 06:12 sbin -> usr/sbindrwxr-xr-x.   2 root root     6 4月  11 2018 srvdr-xr-xr-x.  13 root root     0 9月  29 05:19 sysdrwxr-xr-x.   3 root root    43 9月  26 19:11 testdrwxrwxrwt.  24 root root  4096 9月  29 06:38 tmpdrwxr-xr-x.  13 root root   155 9月  10 06:12 usrdrwxr-xr-x.  22 root root  4096 9月  10 06:45 var

  1. 顯示文件中的第2行內容 .

顯示文件中的第2行內容 .

  1. 刪除文件中3~13行

  1. 刪除匹配boot的行

  1. 刪除以d開頭的行

5.刪除包含d字符的行

6.列印匹配以d開頭到以l開頭的行(多次匹配)

7.列印dev到第5行,其中不包含第5行

8.列印第2行到匹配到dev之間的行

9.除3~16行之間的數據,將其它數據輸出

以下主要正則正則匹配的實戰練習

先準備數據文件,通過cat命令查看java.conf文件

[root@localhost test]# [root@localhost test]# cat java.conf # System-wide Java configuration file -*- sh -*-# Location of jar files on the systemJAVA_LIBDIR=/usr/share/java# Location of arch-specific jar files on the systemJNI_LIBDIR=/usr/lib/java# Root of all JVM installationsJVM_ROOT=/usr/lib/jvm# You can define a system-wide JVM root here if you're not using the# default one.## If you have a base JRE package installed# (e.g. java-1.6.0-openjdk):#JAVA_HOME=$JVM_ROOT/jre## If you have a devel JDK package installed# (e.g. java-1.6.0-openjdk-devel):#JAVA_HOME=$JVM_ROOT/java# Options to pass to the java interpreter#JAVACMD_OPTS=# You can disable ABRT Java Connector by setting JAVA_ABRT to "off".# See: https://github.com/jfilak/abrt-java-connector/#JAVA_ABRT=off[root@localhost test]#

  1. 過濾掉注釋的行,備註:注釋的行是以#開頭

  1. 過濾掉所有的空行

  1. 過濾掉所有注釋行和空行,此命令用到{},不清楚的可參考上面的命令

  1. 刪除掉所有注釋行和空行,(這裡的刪除並非對源文件內容進行刪除)

  1. 匹配任何包含JVM的行

  1. 匹配包含JNI_LIBDIR或者JVM_ROOT的行

  1. 匹配任何包含數字的行

以下主要針對各命令的練習,如s,i,a,r,w,p等

  1. 將含有aaa字符的第一個字符a 替換成b.

  1. 將含有aaa的字符替換成bbb.

  1. 將JAVA_HOME替換成JAVA_DIR,注意,此文件包含多行JAVA_HOME

  1. 替換第二行內容中的root為test,注意是第一個匹配到的root字符。

  1. 替換第二,三行中的root為test,這次為全局替換

  1. 替換第二行到最後一行的root為test(全局替換)

  1. 在匹配See字符的行,行首添加hello

  1. 在匹配See字符的行,在See字符後添加hello

  1. 在匹配See字符的行,在See字符前添加hello

  1. 在匹配See字符的行,在行尾添加hello

  1. 在每一行的開頭添加hello 。

  1. 在每一行的結尾添加hello 。

13.在前三行的行首添加hello 。

  1. 在匹配ddd字符的行的前面一行添加hello

  1. 在匹配ddd字符的行的後面一行添加hello

  1. 在匹配的ddd行的下一行添加多行內容。

  1. 將一個新行添加到文件的第三行。

  1. 查詢boot的行是在第幾行

以上所有的替換或變化都不會改變原文件的內容 。

  1. 將文件info中的ccc修改為xyz。

  1. 將文件info中匹配到tmp的行,其中包含root的字符修改為test .

  1. 在匹配kkk的行的結尾添加end字符 。

  1. 直接替換文件中第三行的內容。

23.將指定文件abc.txt中的內容插入到info文件的第三行

  1. 將文件aa.txt中的前兩行輸出到文本文件abc.txt。

  1. 將aa.txt中匹配boot的行寫入到a1.txt中

  1. 讀取文件a.sh中的指令進行替換xxx為hello world .

相關焦點

  • linux基礎命令(文本處理1)
    查看文本查看文本內容在linux基礎命令(文件操作/文件權限)中介紹了查看文本命令:cat、more、less、tail、head的使用,下面說下查看文本的其他命令:tac、rev、cut、paste、join、wc、diff、sort、uniq倒序顯示文本內容
  • Linux常用命令 - sed
    在處理文本文件時,通常需要在一個或多個文件中查找和替換文本字符串。sed 是一個流編輯器。它可以對文件和輸入流(如管道)執行基本的文本操作。使用 sed,您可以搜索、查找和替換、插入和刪除單詞和行。 它支持基本的和擴展的正則表達式,允許您匹配複雜的模式。
  • Linux 三劍客之 Sed
    Linux sed 命令是利用腳本來處理文本文件。類似於sql:sed=update table set field=new where field=old Sed本身是一個管道命令,可以分析 standard input 的,主要是用來分析關鍵字的使用、統計等,此外還可 以將數據進行替換、刪除、選中、選取特定行等功能Sed 語法:sed [-hnV][-e<script
  • linux三劍客-sed
    一、sed命令簡介sed把當前正在處理的行保存在一個臨時緩存區中,這個緩存區稱為模式空間或臨時緩衝。sed處理完模式空間中的行後(在該行上執行sed命令後),就把該行發送到屏幕上(除非之前有命令刪除這一行或取消列印操作),sed每處理完輸入文件的最後一行,sed便結束運行。sed把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改或破壞源文件。
  • 詳解Linux sed 命令語法、以及經典50例
    基礎知識要求:了解linux正則、管道符、cat命令sed實例介紹 sed是GNU / Linux的有用的文本處理功能。sed的完整形式是Stream Editor。通過使用sed命令可以很容易地完成許多類型的簡單和複雜的文本處理任務。
  • Linux shell腳本編程入門系列七:linux三劍客之awk
    awk命令的作用是進行文本掃描、處理以及報表的生成。awk命令有自己的語法規則,官方說法叫「樣式掃描和處理語言」,其語法借鑑了C語言的精華。由於其強大的文本分析能力與格式化輸出能力,awk命令成為Linux環境開發者的必備殺器,與grep命令、sed命令一起被稱為Linux三劍客。熟練運用awk命令能讓我們的日常工作變得高端同時也高效起來。
  • 35個參數13個案例,全面解析Linux三劍客之grep命令
    符合的組合就定義了一套規則和方法,其主要作用就是從大量文本從匹配出符合條件行。2.正則表達式的使用場景在Linux中,正則表達式的主要使用場景就是文本處理三劍客。接下來我們主要說明在Linux 三劍客中的不同(grep,sed,awk)grep : 在grep中,如果只是使用grep命令 ,可使用原字符的正則或者預定義字符類,而若想使用擴展正則中包含的字符,就必須在grep後加參數-E 。
  • Linux之sed命令詳解
    sedsed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法sed命令行格式為:sed [-nefri] 『command』 輸入文本
  • sed命令(一):入門
    什麼是sedsed全名叫stream editor,流編輯器,用程序的方式來編輯文本sed處理原理sed編輯器逐行處理文件(或輸入),並將結果發送到屏幕。具體過程如下:首先sed把當前正在處理的行保存在一個臨時緩存區中(也稱為模式空間),然後處理臨時緩衝區中的行,完成後把該行發送到屏幕上。sed每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入文件的最後一行後,sed便結束運行。sed命令和選項命令:a ——在當前行後添加一行或多行。
  • Linux sed命令完全攻略(超級詳細)
    我們知道,Vim 採用的是交互式文本編輯模式,你可以用鍵盤命令來交互性地插入、刪除或替換數據中的文本。但本節要講的 sed 命令不同,它採用的是流編輯模式,最明顯的特點是,在 sed 處理數據之前,需要預先提供一組規則,sed 會按照此規則來編輯數據。
  • sed 命令快速入門
    awk,各自的最佳應用場景:grep:使用正則表達式搜索文本,並把匹配的行列印出來,是強大的文本搜索工具;sed:用於編輯匹配到的文本,是一種流編輯器;awk:能夠對文本進行複雜的格式處理,是一種處理文本的語言。
  • linux系統sed命令基礎
    處理文本工具:grep -E 擴展的正則表達式 , 抓取、匹配用戶想要的信息。awksed 文本處理、編輯工具,能夠根據用戶的需求進行修改文本。sed 處理文本的方式: 逐行處理迭代處理, 能夠大大節省內存。
  • Linux三大劍客之sed(上)
    3.2 命令行選項完整格式調用sed:sed OPTIONS... [SCRIPT] [INPUTFILE...]sed可能被以下命令行選項調用: --version:列印版本信息。--help:列印簡要幫助信息並退出。
  • shell中的文本處理工具
    在Linux世界一切皆文件,而且絕大多數都是文本文件。Shell是強大的用戶界面,其強大之處在於Shell中自帶了大量的文本處理工具,而且這些工具可以通過通道串聯起來形成流式處理線。這些命令使執行文本處理分析,在不同格式,過濾器行之間轉換數據等工作變得輕而易舉。*nix界的一個哲學是"專心做好一件事"。
  • Linux Shell自動化基礎之Grep
    今天我們就來講Linux Shell下的文本處理三劍客之Grep。為了了解其用法最簡便方法是使用系統幫助和man:grep -hman grep其中man的比較詳細,來自於其幫助手冊,在linux(centos為例)下查詢內置命令幫助手冊的方法是用rpm -qd grep-q表示查詢;-d表示列出其文檔(document):rpm -qd grepgrep基礎在開始之前
  • 看測試工程師把Linux命令玩得這麼溜,測試小白還不趕緊上車 貳
    昨天結合了測試工程師一些實際的工作場景,列舉了一些linux命令的具體使用方法,可能比較貼近大家工作所需,那麼下面,繼續這種場景模式,來引出更多linux命令的用法。下面請看:場景一:Linux 找出log中的404或者500 的報錯grep我們知道,linux中的三劍客之一grep命令,是用於查找文件裡符合條件的字符串的命令。
  • sed命令的基礎知識及簡單應用
    Sed是一Linux命令,全稱:Stream Editor,功能和awk類似,但是沒有awk功能強大,相對簡單,awk處理列的功能比awk差很多。Sed主要用於自動編輯一個或者多個文件,多用於腳本中對文件的處理。Sed命令對文件的進行增加、刪除、修改和查找操作,所以是學好sed命令是寫自動化腳本必須的基礎之一。
  • 在Linux命令行內的大小寫轉換
    在編輯文本時大小寫常常是需要注意的地方,大小寫的轉換是很枯燥而繁瑣的工作,所幸,Linux 提供了很多能讓這份工作變得容易的命令。接下來讓我們看看都有哪些完成大小寫轉換的命令。tr 命令tr (translate) 是能運用在命令行或者腳本上的最簡單的大小寫轉換命令之一。
  • 運用sed命令高效地刪除文件的特定行
    為此,今天這篇文章將帶大家一起學習運用 sed 命令行工具,即使在數據多而雜的情況下也能高效而優雅地刪除文件中的特定行內容。sed 是 Stream Editor 的簡寫,它用於在 Linux 中進行基本的文本轉換,是文件操作的一個重要命令,所以,我們也可以用它來實現文本的刪除操作。
  • 史上最全的 Linux Shell 文本處理工具集錦,快收藏
    本文將介紹Linux下使用Shell處理文本時最常用的工具:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;提供的例子和參數都是最常用和最為實用的;對shell腳本使用的原則是命令單行書寫,儘量不要超過2行;如果有更為複雜的任務需求,還是考慮python吧;