posts - 68, comments - 19, trackbacks - 0, articles - 1

          sed命令

          Posted on 2018-09-06 13:36 viery 閱讀(199) 評論(0)  編輯  收藏 所屬分類: linux

          1,前言

          • 我們都知道,在Linux中一切皆文件,比如配置文件,日志文件,啟動文件等等。如果我們相對這些文件進行一些編輯查詢等操作時,我們可能會想到一些vi,vim,cat,more等命令。但是這些命令效率不高,這就好比一塊空地準備搭建房子,請了10個師傅拿著鐵鍬挖地基,花了一個月的時間才挖完,而另外一塊空地則請了個挖土機,三下五除二就搞定了,這就是效率。而在linux中的“挖土機”有三種型號:頂配awk,中配sed,標配grep。使用這些工具,我們能夠在達到同樣效果的前提下節省大量的重復性工作,提高效率。

          • 接下來我們就看一下sed的詳細說明

          • sed 是Stream Editor(字符流編輯器)的縮寫,簡稱流編輯器。什么是流?大家可以想象以下流水線,sed就像一個車間一樣,文件中的每行字符都是原料,運到sed車間,然后經過一系列的加工處理,最后從流水線下來就變成貨物了。

          2,軟件功能與版本

          • Sed命令是操作,過濾和轉換文本內容的強大工具。常用功能有增刪改查(增加,刪除,修改,查詢),其中查詢的功能中最常用的2大功能是過濾(過濾指定字符串),取行(取出指定行)。

          • 我們現在準備學習的sed版本是GNU開源版本的,我的實驗環境是CentOS6.8系統,內核版本是2.6.32-642.el6.x86_64

          3,語法格式

          sed [options] [sed -commands][input -file] sed [選項]  【sed命令】 【輸入文件】

          4,命令執行流程

          文件person.txt在模式空間的完整處理流程

          1,判斷第1行是否是需要處理的行,如果不是要處理的行就重新從文件讀取下一行,如果是要處理的行,則接著往下走。
          2,對模式空間的內容執行sed命令,比如a(追加),i(插入),s(替換)...
          3,將模式空間中經過sed命令處理后的內容輸出到屏幕上,然后清空模式空間
          4,讀取下一行文本,然后重新執行上面的流程,直到文件結束

          5,選項說明

          option[選項]解釋說明(帶*的為重點)
          -n取消默認的sed軟件的輸出,常與sed命令的p連用。*
          -e一行命令語句可以執行多條sed命令
          -f選項后面可以接sed腳本的文件名
          -r使用擴展正則表達式,默認情況sed只識別基本正則表達式*
          -i直接修改文件內容,而不是輸出到終端,如果不使用-i選項sed軟件只是修改在內存中的數據,并不會影響磁盤上的文件*

          wKiom1kRYw-CvyecAACXuCHwLm0408.png-wh_50

          wKioL1kRY16xUF87AAAslk3Zia8849.png-wh_50

          6,使用范例

          6.1 統一實驗文本

          [root@chensiqi1 ~]# cat >person.txt<<KOF

          > 101,chensiqi,CEO

          > 102,zhangyang,CTO

          > 103,Alex,COO

          > 104,yy,CFO

          > 105,feixue,CIO

          > KOF          #KOF必須成對出現,表示終止輸入


          6.2 常用功能-增刪改查

          6.2.1 增

          • 這里我們需要用到2個sed命令,分別是:
            “a”:追加文本到指定行后,記憶方法:a的全拼是apend,意思是追加。
            “i“:插入文本到指定行前,記憶方法:i的全拼是insert,意思是插入。

          6.2.1.1 單行增

          [root@chensiqi1 ~]# sed '2a 106,dandan,CSO' person.txt

          101,chensiqi,CEO

          102,zhangyang,CTO106,dandan,CSO   #這就是新增那句

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO

          命令行詳解:

          • 2代表指定對第2行操作,其他的行忽略

          • i代表插入的意思,2i即在第2行前插入文本

          • 2i后面加上空格,然后跟上你想要插入的文本即可

          最后接上你想要處理的文件person.txt

          6.2.1.2 引號的區別總結
          1. 雙引號:把雙引號的內容輸出出來;如果內容中有命令,變量等,會先把命令,變量解析出結果,然后再輸出最終內容來。雙引號內命令或變量的寫法為`命令或變量`或$(命令或變量)

          2. 單引號:所見即所得,將單引號內的內容原樣輸出,阻止所有字符的轉義

          3. 不加引號:不會將含有空格的字符串視為一個整體輸出,如果內容中有命令,變量等,會先把命令,變量解析出結果,然后再輸出最終內容來,如果字符串含有空格等特殊字符,則不能完整輸出,則需改加雙引號。

          4. 倒引號(反引號Esc鍵下方):進行命令的替換,在倒引號內部的shell命令將會被執行,其結果輸出代替用倒引號括起來的文本。


          Sed為何用單引號?

          [root@chensiqi1 ~]# cat person.txt

          101,chensiqi,CEO

          102,zhangyang,CTO

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO [root@chensiqi1 ~]# sed '2i $PATH' person.txt  #單引號--文本內容原封不動插入

          101,chensiqi,CEO $PATH

          102,zhangyang,CTO

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO

          [root@chensiqi1 ~]# sed 2i $PATH person.txt   #不加引號,linux無法辨認空格,不會把有空格的命令當成一條命令來執行sed: -e expression #1, char 2: expected \ after `a', `c' or `i'

          [root@chensiqi1 ~]# sed "2i $PATH" person.txt #雙引號--變量$PATH被解析以后在當作文本進行插入

          101,chensiqi,CEO /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 102,zhangyang,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO


          企業案例1:優化SSH配置(一鍵完成增加若干參數

          在我們學習CentOS6系統優化時,有一個優化點:更改ssh服務遠程登錄的配置。主要的操作是在ssh的配置文件/etc/ssh/sshd_config加入下面5行文本。(下面參數的具體含義見其他課程。)

          Port 52113

          PermitRootLogin no

          PermitEmptyPasswords no

          UseDNS no

          GSSAPIAuthentication no


          這道企業面試題可以用我們學過的sed命令多行追加功能就可以搞定。

          [root@chensiqi1 ~]# sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config


          命令說明:題目要求在第13行前插入,那就需要使用命令13i。有同學做個題目時,是這樣想的,在13行前,那不就是12行后嗎,12a也是可以的。是的,這樣也是沒錯的,這可以算是第二種方法。 最后插入的5行內容使用“\n”就可以變成一行了。 上面還有一個沒講過的選項"-i",這個選項能夠實際的修改文件內容,大家練習時可以去掉,防止改掉了配置文件。如果使用了-i,可以用備份文件還原。當然,在生產環境修改配置文件那就需要用-i選項了。


          [root@chensiqi1 ~]# sed -n '13,17p' /etc/ssh/sshd_config

          Port 52113

          PermitRootLogin no

          PermitEmptyPasswords no

          UseDNS no

          GSSAPIAuthentication no

          命令說明:查看增加的文本內容,選項-n與命令p的具體用法見后文的6.2.4查。


          6.2.2 刪

          6.2.2.1指定執行的地址范圍

          [root@chensiqi1 ~]# sed 'd' person.txt 下面用具體的例子演示一下,測試文件還是person.txt

          [root@chensiqi1 ~]#

          命令說明:如果在sed命令前面不指定地址范圍,那么默認會匹配所有行,然后使用d命令刪除功能就會刪除這個文件的所有內容


          [root@chensiqi1 ~]# sed '2d' person.txt

          101,chensiqi,CEO

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO

          命令說明:這個單行刪除想必大家能理解,指定刪除第2行的文本102,zhangyang,CTO


          [root@chensiqi1 ~]# sed '/zhangyang/d' person.txt

          101,chensiqi,CEO

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO

          命令說明: 在sed軟件中,使用正則的格式和awk一樣,使用2個”/“包含指定的正則表達式,即“/正則表達式/”


          6.2.2.2 特殊符號~(步長)解析

          例子:

          • 1~2 匹配1,3,5,7.....#-->用于只輸出奇書行,大伙仔細觀察一下每個數字的差值。

          • 2~2 匹配2,4,6,8....#-->用于只輸出偶數行

          • 1~3 匹配1,4,7,10.....

          • 2~3 匹配2,5,8,11.....

          [root@chensiqi1 ~]# seq 10

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          命令說明:seq命令能夠生成從110的數字序列。


          6.2.2.3 特殊符號+解析

          [root@chensiqi1 ~]# sed '1,+2d' person.txt  

          104,yy,CFO

          105,feixue,CIO

          命令說明:這其實是做個加法運算,‘1,+2d’==>刪除第1行到第31+2)行的文本。


          6.2.2.4 特殊符號!解析

          感嘆號“!”我們在很多命令里都接觸過,大部分都是取反的意思,在sed中也不例外

          [root@chensiqi1 ~]# sed '2,3!d' person.txt

          102,zhangyang,CTO

          103,Alex,COO 命令說明:

          在地址范圍“23”后面加上“!”,如果不加“!”表示刪除第2行和第3行,結果如下面的例子所示

          然后加上“!”的結果就是除了第2行和第3行以外的內容都刪除,這個方法可以作為顯示文件的第23行題目的補充方法。

          [root@chensiqi1 ~]# sed '2,3d' person.txt 101,chensiqi,CEO104,yy,CFO105,feixue,CIO


          6.2.3 改

          6.2.3.1 按行替換

          例子:

          [root@chensiqi1 ~]# sed '2c 106,dandan,CSO' person.txt

          101,chensiqi,CEO

          106,dandan,CSO

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO

          命令說明:使用sed命令c將原來第2行“102,zhangyang,CTO”替換成“106,dandan,CSO”,整行替換

          6.2.3.2 文本替換
          • 這里用到的sed命令,選項:
            “s”:單獨使用-->將每一行中第一處匹配的字符串進行替換==>sed命令
            “g”:每一行進行全部替換-->sed命令s的替換標志之一(全局替換),非sed命令。
            “-i”:修改文件內容-->sed軟件的選項,注意和sed命令i區別。

          sed軟件替換模型

          sed -i 's/目標內容/替換內容/g' chensiqi.log
          sed -i 's#目標內容#替換內容#g'

          例子:

          [root@chensiqi1 ~]# sed 's#zhangyang#dandan#g' person.txt

          101,chensiqi,CEO

          102,dandan,CTO

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO

          命令說明:

          將需要替換的文本“zhangyang”放在第一個和第二個“#”之間

          將替換后的文本“dandan”放在第二個核第三個“#”之間。結果為第二行的“zhangyang”替換為“dandan”


          6.2.3.3 變量替換

          [root@chensiqi1 ~]# cat >test.txt<<KOF #再新建一個簡單的測試文本

          > a > b > a > KOF [root@chensiqi1 ~]# cat test.txt

          a b a [root@chensiqi1 ~]# x=a #->設置變量x并 賦值a

          [root@chensiqi1 ~]# y=b #-> 設置變量y并賦值b

          [root@chensiqi1 ~]# echo $x

          a [root@chensiqi1 ~]# echo $x $y

          a b 命令說明:打印變量x,y驗證一下,需要使用$符號引用變量


          6.2.3.4 分組替換()和\1的使用說明

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

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

          [root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed 's#^.*am \([a-z]\+\) tea.*$#\1#g'

          chensiqi [root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#^.*am ([a-z]+) tea.*$#\1#g'

          chensiqi [root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#I (.*) (.*) teacher.#\1\2#g'

          amchensiqi 命令說明: sed如果不加-r后綴,那么默認不支持擴展正則表達式,需要\符號進行轉義

          小括號的作用是將括號里的匹配內容進行分組以便在第2和第3#號之間進行sed的反向引用,\1代表引用第一組,\2代表引用第二組


          企業案例4:系統開機啟動項優化(利用sed)

          [root@chensiqi1 ~]# chkconfig --list | egrep -v  "sshd|crond|rsyslog|sysstat|network" | awk '{print $1}' |sed -r 's#^(.*)#chkconfig \1 off#g' |bash


          6.2.4 查

          6.2.4.1 按行查詢

          [root@chensiqi1 ~]# sed '2p' person.txt

          101,chensiqi,CEO

          102,zhangyang,CTO

          102,zhangyang,CTO

          103,Alex,COO

          104,yy,CFO

          105,feixue,CIO

          命令說明:選項-n取消默認輸出,只輸出匹配的文本,大家只需要記住使用命令p必用選項-n。 [root@chensiqi1 ~]# sed -n '2,3p' person.txt

          102,zhangyang,CTO

          103,Alex,COO 命令說明:查看文件的第2行到3行,使用地址范圍“23”。取行就用sed,最簡單


          6.2.4.2 按字符串查詢

          [root@chensiqi1 ~]# sed -n '/CTO/p' person.txt

          102,zhangyang,CTO 命令說明:打印含CTO的行 [root@chensiqi1 ~]# sed -n '/CTO/,/CFO/p' person.xt

          102,zhangyang,CTO

          103,Alex,COO

          104,yy,CFO 命令說明:打印含CTO的行到含CFO的行。


          6.2.4.3 過濾多個字符

          [root@chensiqi1 ~]# sed -rn '/chensiqi|yy/p' person.txt

          101,chensiqi,CEO

          104,yy,CFO 命令說明: 使用擴展正則“|”,為了不使用轉義符號“\”,因此使用-r選項開啟擴展正則表達式模式


          7,sed命令應用知識擴展

          7.1 sed如何取不連續的行

          [root@chensiqi1 ~]# sed -n '1p;3p;5p' person.txt

          101,chensiqi,CEO

          103,Alex,COO

          105,feixue,CIO

          7.2 特殊符號{}的使用

          [root@chensiqi1 ~]# sed -n '2,4p;=' person.txt

          1

          102,NB,CTO

          2

          103,Alex,COO

          3

          104,yy,CFO

          4

          5

          命令說明:-n去掉默認輸出,2,4p,輸出24行內容,=輸出全部的行的行號 [root@chensiqi1 ~]# sed -n '2,4{p;=}' person.txt

          102,NB,CTO

          2

          103,Alex,COO

          3

          104,yy,CFO

          4

          命令說明:‘24{p;=}’代表統一輸出24行的行號和內容

          主站蜘蛛池模板: 永丰县| 舞钢市| 霞浦县| 金湖县| 铜川市| 盐源县| 定日县| 潍坊市| 甘德县| 密山市| 绿春县| 山东省| 得荣县| 桐城市| 邓州市| 长岭县| 高要市| 英山县| 平武县| 澄江县| 长顺县| 东莞市| 台前县| 伊春市| 张家川| 梁河县| 通河县| 阜新| 大邑县| 无棣县| 徐州市| 青海省| 鹤峰县| 青铜峡市| 双柏县| 财经| 张家港市| 东乌| 巴里| 二连浩特市| 珲春市|