<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    sed命令

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

    1,前言

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

    • 接下來我們就看一下sed的詳細(xì)說明

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

    2,軟件功能與版本

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

    • 我們現(xiàn)在準(zhǔn)備學(xué)習(xí)的sed版本是GNU開源版本的,我的實(shí)驗(yàn)環(huán)境是CentOS6.8系統(tǒng),內(nèi)核版本是2.6.32-642.el6.x86_64

    3,語法格式

    sed [options] [sed -commands][input -file] sed [選項(xiàng)]  【sed命令】 【輸入文件】

    4,命令執(zhí)行流程

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

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

    5,選項(xiàng)說明

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

    wKiom1kRYw-CvyecAACXuCHwLm0408.png-wh_50

    wKioL1kRY16xUF87AAAslk3Zia8849.png-wh_50

    6,使用范例

    6.1 統(tǒng)一實(shí)驗(yàn)文本

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

    > 101,chensiqi,CEO

    > 102,zhangyang,CTO

    > 103,Alex,COO

    > 104,yy,CFO

    > 105,feixue,CIO

    > KOF          #KOF必須成對(duì)出現(xiàn),表示終止輸入


    6.2 常用功能-增刪改查

    6.2.1 增

    • 這里我們需要用到2個(gè)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代表指定對(duì)第2行操作,其他的行忽略

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

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

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

    6.2.1.2 引號(hào)的區(qū)別總結(jié)
    1. 雙引號(hào):把雙引號(hào)的內(nèi)容輸出出來;如果內(nèi)容中有命令,變量等,會(huì)先把命令,變量解析出結(jié)果,然后再輸出最終內(nèi)容來。雙引號(hào)內(nèi)命令或變量的寫法為`命令或變量`或$(命令或變量)

    2. 單引號(hào):所見即所得,將單引號(hào)內(nèi)的內(nèi)容原樣輸出,阻止所有字符的轉(zhuǎn)義

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

    4. 倒引號(hào)(反引號(hào)Esc鍵下方):進(jìn)行命令的替換,在倒引號(hào)內(nèi)部的shell命令將會(huì)被執(zhí)行,其結(jié)果輸出代替用倒引號(hào)括起來的文本。


    Sed為何用單引號(hào)?

    [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  #單引號(hào)--文本內(nèi)容原封不動(dòng)插入

    101,chensiqi,CEO $PATH

    102,zhangyang,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@chensiqi1 ~]# sed 2i $PATH person.txt   #不加引號(hào),linux無法辨認(rèn)空格,不會(huì)把有空格的命令當(dāng)成一條命令來執(zhí)行sed: -e expression #1, char 2: expected \ after `a', `c' or `i'

    [root@chensiqi1 ~]# sed "2i $PATH" person.txt #雙引號(hào)--變量$PATH被解析以后在當(dāng)作文本進(jìn)行插入

    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


    企業(yè)案例1:優(yōu)化SSH配置(一鍵完成增加若干參數(shù)

    在我們學(xué)習(xí)CentOS6系統(tǒng)優(yōu)化時(shí),有一個(gè)優(yōu)化點(diǎn):更改ssh服務(wù)遠(yuǎn)程登錄的配置。主要的操作是在ssh的配置文件/etc/ssh/sshd_config加入下面5行文本。(下面參數(shù)的具體含義見其他課程。)

    Port 52113

    PermitRootLogin no

    PermitEmptyPasswords no

    UseDNS no

    GSSAPIAuthentication no


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

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


    命令說明:題目要求在第13行前插入,那就需要使用命令13i。有同學(xué)做個(gè)題目時(shí),是這樣想的,在13行前,那不就是12行后嗎,12a也是可以的。是的,這樣也是沒錯(cuò)的,這可以算是第二種方法。 最后插入的5行內(nèi)容使用“\n”就可以變成一行了。 上面還有一個(gè)沒講過的選項(xiàng)"-i",這個(gè)選項(xiàng)能夠?qū)嶋H的修改文件內(nèi)容,大家練習(xí)時(shí)可以去掉,防止改掉了配置文件。如果使用了-i,可以用備份文件還原。當(dāng)然,在生產(chǎn)環(huán)境修改配置文件那就需要用-i選項(xiàng)了。


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

    Port 52113

    PermitRootLogin no

    PermitEmptyPasswords no

    UseDNS no

    GSSAPIAuthentication no

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


    6.2.2 刪

    6.2.2.1指定執(zhí)行的地址范圍

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

    [root@chensiqi1 ~]#

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


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

    101,chensiqi,CEO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    命令說明:這個(gè)單行刪除想必大家能理解,指定刪除第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個(gè)”/“包含指定的正則表達(dá)式,即“/正則表達(dá)式/”


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

    例子:

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

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

    • 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的數(shù)字序列。


    6.2.2.3 特殊符號(hào)+解析

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

    104,yy,CFO

    105,feixue,CIO

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


    6.2.2.4 特殊符號(hào)!解析

    感嘆號(hào)“!”我們?cè)诤芏嗝罾锒冀佑|過,大部分都是取反的意思,在sed中也不例外

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

    102,zhangyang,CTO

    103,Alex,COO 命令說明:

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

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

    [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命令,選項(xiàng):
      “s”:?jiǎn)为?dú)使用-->將每一行中第一處匹配的字符串進(jìn)行替換==>sed命令
      “g”:每一行進(jìn)行全部替換-->sed命令s的替換標(biāo)志之一(全局替換),非sed命令。
      “-i”:修改文件內(nèi)容-->sed軟件的選項(xiàng),注意和sed命令i區(qū)別。

    sed軟件替換模型

    sed -i 's/目標(biāo)內(nèi)容/替換內(nèi)容/g' chensiqi.log
    sed -i 's#目標(biāo)內(nèi)容#替換內(nèi)容#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”放在第一個(gè)和第二個(gè)“#”之間

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


    6.2.3.3 變量替換

    [root@chensiqi1 ~]# cat >test.txt<<KOF #再新建一個(gè)簡(jiǎn)單的測(cè)試文本

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

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

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

    [root@chensiqi1 ~]# echo $x

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

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


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

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

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

    [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后綴,那么默認(rèn)不支持?jǐn)U展正則表達(dá)式,需要\符號(hào)進(jìn)行轉(zhuǎn)義

    小括號(hào)的作用是將括號(hào)里的匹配內(nèi)容進(jìn)行分組以便在第2和第3個(gè)#號(hào)之間進(jìn)行sed的反向引用,\1代表引用第一組,\2代表引用第二組


    企業(yè)案例4:系統(tǒng)開機(jī)啟動(dòng)項(xiàng)優(yōu)化(利用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

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

    102,zhangyang,CTO

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


    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 過濾多個(gè)字符

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

    101,chensiqi,CEO

    104,yy,CFO 命令說明: 使用擴(kuò)展正則“|”,為了不使用轉(zhuǎn)義符號(hào)“\”,因此使用-r選項(xiàng)開啟擴(kuò)展正則表達(dá)式模式


    7,sed命令應(yīng)用知識(shí)擴(kuò)展

    7.1 sed如何取不連續(xù)的行

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

    101,chensiqi,CEO

    103,Alex,COO

    105,feixue,CIO

    7.2 特殊符號(hào){}的使用

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

    1

    102,NB,CTO

    2

    103,Alex,COO

    3

    104,yy,CFO

    4

    5

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

    102,NB,CTO

    2

    103,Alex,COO

    3

    104,yy,CFO

    4

    命令說明:‘24{p;=}’代表統(tǒng)一輸出24行的行號(hào)和內(nèi)容

    主站蜘蛛池模板: free哆拍拍免费永久视频| 亚洲小说区图片区另类春色| 亚洲熟妇久久精品| A在线观看免费网站大全| 亚洲精品国产福利片| 91福利视频免费| 久久久久亚洲AV无码专区体验| 人妻丰满熟妇无码区免费 | 国产国产人免费视频成69堂| 1区1区3区4区产品亚洲| 99精品视频在线观看免费专区| 亚洲图片一区二区| 色欲A∨无码蜜臀AV免费播| 亚洲综合无码一区二区| 120秒男女动态视频免费| 亚洲熟妇无码爱v在线观看| 亚洲一区免费在线观看| 亚洲综合久久一本伊伊区| 成全视频免费高清 | 久久久久国产精品免费免费搜索| 亚洲乱码在线观看| 热99re久久精品精品免费| 色婷婷亚洲一区二区三区| 亚洲高清免费视频| 精品无码一级毛片免费视频观看 | 亚洲成色WWW久久网站| 日本亚洲欧洲免费天堂午夜看片女人员| 久久精品国产亚洲AV网站| 久久久久久国产精品免费无码| 亚洲字幕在线观看| 免费无码肉片在线观看| 亚洲国产精品美女久久久久| 免费永久看黄在线观看app| 一级毛片免费在线| 亚洲综合国产一区二区三区| 日韩视频在线观看免费| 亚洲性一级理论片在线观看| 日本免费福利视频| 一个人晚上在线观看的免费视频| 精品亚洲综合久久中文字幕| 在线观看www日本免费网站|