sed用法的体会
sed 的基本語法為
sed [options] [sed-commands] [input-file]
sed [選項] ? ? [sed命令] ? ? ?[輸入文件]
選項分別為:
? ??-n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
??????? -e∶直接在指令列模式上進行 sed 的動作編輯;
??????? -f∶直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作;
??????? -r∶sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
??????? -i∶直接修改讀取的檔案內容,而不是由螢幕輸出。? ? ??
sed命令為:??
? ? ? ? a?? ∶新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
??????? c?? ∶取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
??????? d?? ∶刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;
???????? i?? ∶插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
???????? p??∶列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
???????? s??∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!
使用方法如下:
#?創建包含下面內容的文件,后面的操作都會使用這個文件。[root@oldboy?~]#?cat?person.txt101,oldboy,CEO102,zhangyao,CTO103,Alex,COO104,yy,CFO105,feixue,CIO
2. 增刪改查
2.1 增
a 追加文本到指定行后
i 插入文本到指定行前
2.1.1 單行增加
[root@oldboy?~]#?sed?'2a?106,dandan,CSO'?person.txt101,oldboy,CEO102,zhangyao,CTO106,dandan,CSO103,Alex,COO104,yy,CFO105,feixue,CIO[root@oldboy?~]#?sed?'2i?106,dandan,CSO'?person.txt101,oldboy,CEO106,dandan,CSO102,zhangyao,CTO103,Alex,COO104,yy,CFO105,feixue,CIO2.1.2 多行增加
[root@oldboy?~]#?sed?'2a?106,dandan,CSO\n107,bingbing,CCO'?person.txt101,oldboy,CEO102,zhangyao,CTO106,dandan,CSO?#→第1種寫法107,bingbing,CCO103,Alex,COO104,yy,CFO105,feixue,CIO[root@oldboy?~]#?sed?'2a?106,dandan,CSO?\>?107,bingbing,CCO'?person.txt101,oldboy,CEO102,zhangyao,CTO106,dandan,CSO?#→第2種寫法107,bingbing,CCO103,Alex,COO104,yy,CFO105,feixue,CIO#→sed命令i的使用方法是一樣的,因此不再列出。企業案例1:優化SSH配置(一鍵完成增加若干參數)
在我們學習系統優化時,有一個優化點:更改ssh服務遠程登錄的配置。主要的操作是在ssh的配置文件加入下面5行文本。(下面參數的具體含義見其他課程。)
Port?52113PermitRootLogin?noPermitEmptyPasswords?noUseDNS?noGSSAPIAuthentication?no我們可以使用vi命令編輯這個文本,但這樣就比較麻煩,現在想一條命令增加5行文本到第13行前?
指定執行的地址范圍
sed軟件可以對單行或多行進行處理。如果在sed命令前面不指定地址范圍,那么默認會匹配所有行。用法:n1[,n2]{sed-commands}地址用逗號分隔的,n1,n2可以用數字、正則表達式、或二者的組合表示。例子: 10{sed-commands}????????對第10行操作 10,20{sed-commands}?????對10到20行操作,包括第10,20行 10,+20{sed-commands}???對10到30(10+20)行操作,包括第10,30行 1~2{sed-commands}???????對1,3,5,7,……行操作 10,${sed-commands}?????對10到最后一行($代表最后一行)操作,包括第10行????/oldboy/{sed-commands}?????????對匹配oldboy的行操作????/oldboy/,/Alex/{sed-commands}??對匹配oldboy的行到匹配Alex的行操作????/oldboy/,${sed-commands}???????對匹配oldboy的行到最后一行操作????/oldboy/,10{sed-commands}??????對匹配oldboy的行到第10行操作,注意:如果前10行沒有匹配到oldboy,sed軟件會顯示10行以后的匹配oldboy的行,如果有。????1,/Alex/{sed-commands}?????????對第1行到匹配Alex的行操作????/oldboy/,+2{sed-commands}??????對匹配oldboy的行到其后的2行操作2.2 刪
d 刪除指定的行
[root@oldboy?~]#?sed?'d'?person.txt[root@oldboy?~]#[root@oldboy?~]#?sed?'2d'?person.txt101,oldboy,CEO103,Alex,COO104,yy,CFO105,feixue,CIO[root@oldboy?~]#?sed?'2,5d'?person.txt101,oldboy,CEO[root@oldboy?~]#?sed?'3,$d'?person.txt101,oldboy,CEO102,zhangyao,CTO[root@oldboy?~]#?sed?'1~2d'?person.txt102,zhangyao,CTO104,yy,CFO[root@oldboy?~]#?sed??'1,+2d'?person.txt104,yy,CFO105,feixue,CIO[root@oldboy?~]#?sed?'/zhangyao/d'?person.txt101,oldboy,CEO103,Alex,COO104,yy,CFO105,feixue,CIO[root@oldboy?~]#?sed?'/oldboy/,/Alex/d'?person.txt104,yy,CFO105,feixue,CIO[root@oldboy?~]#?sed?'/oldboy/,3d'?person.txt104,yy,CFO105,feixue,CIO企業案例2:打印文件內容但不包含oldboy
[root@oldboy?~]#?sed?'/oldboy/d'?person.txt?#→刪除包含"oldboy"的行102,zhangyao,CTO103,Alex,COO104,yy,CFO105,feixue,CIO2.3 改
2.3.1 按行替換
c 用新行取代舊行
[root@oldboy?~]#?sed?'2c?106,dandan,CSO'?person.txt101,oldboy,CEO106,dandan,CSO103,Alex,COO104,yy,CFO105,feixue,CIO2.3.2 文本替換
s:單獨使用→將每一行中第一處匹配的字符串進行替換 ==>sed命令?
g:每一行進行全部替換 ==>sed命令s的替換標志之一,非sed命令?
-i:修改文件內容 ==>sed軟件的選項
sed軟件替換模型(方框▇被替換成三角▲)
sed -i 's/▇/▲/g' oldboy.log?
sed -i 's#▇#▲#g' oldboy.log
觀察特點
兩邊是引號,引號里面的兩邊分別為s和g,中間是三個一樣的字符/或#作為定界符。#能在替換內容包含/有助于區別。定界符可以是任意符號如:或|等,但當替換內容包含定界符時,需轉義即:?|。經過長期實踐,建議大家使用#作為定界符。
定界符/或#,第一個和第二個之間的就是被替換的內容,第二個和第三個之間的就是替換后的內容。
s#▇#▲#g,▇能用正則表達式,但▲不能用,必須是具體的。
默認sed軟件是對模式空間(內存中的數據)操作,而-i選項會更改磁盤上的文件內容。
企業案例3:指定行修改配置文件
指定行精確修改配置文件,這樣可以防止修改多了地方。
[root@oldboy?~]#?sed?'3s#0#9#'?person.txt101,oldboy,CEO102,zhangyao,CTO193,Alex,COO104,yy,CFO105,feixue,CIO2.3.3 變量替換
[root@oldboy?~]#?cat?test.txt?#→再新建一個文本aba[root@oldboy?~]#?x=a[root@oldboy?~]#?y=b[root@oldboy?~]#?echo?$x?$ya?b[root@oldboy?~]#?sed?s#$x#$y#g?test.txtbbb[root@oldboy?~]#?sed?'s#$x#$y#g'?test.txtaba[root@oldboy?~]#?sed?'s#'$x'#'$y'#g'?test.txtbbb[root@oldboy?~]#?sed?"s#$x#$y#g"?test.txtbbb[root@oldboy?~]#?eval?sed?'s#$x#$y#g'?test.txtbbb2.3.4 分組替換\( \)和\1的使用說明
sed軟件的\( \)的功能可以記住正則表達式的一部分,其中,\1為第一個記住的模式即第一個小括號中的匹配內容,\2第二記住的模式,即第二個小括號中的匹配內容,sed最多可以記住9個。
例:echo I am oldboy teacher.如果想保留這一行的單詞oldboy,刪除剩下的部分,使用圓括號標記想保留的部分。
[root@oldboy?~]#?echo?I?am?oldboy?teacher.?|sed?'s#^.*am?\([a-z].*\)?tea.*$#\1#g'oldboy[root@oldboy?~]#?echo?I?am?oldboy?teacher.?|sed?-r?'s#^.*am?([a-z].*)?tea.*$#\1#g'oldboy[root@oldboy?~]#?echo?I?am?oldboy?teacher.?|sed?-r?'s#I?(.*)?(.*)?teacher.#\1\2#g'amoldboy命令說明
思路:用oldboy字符替換I am oldboy teacher.
下面解釋用□代替空格
^.*am□?–>這句的意思是以任意字符開頭到am□為止,匹配文件中的I am□字符串;
\([a-z].*\)□–>這句的外殼就是括號\(\),里面的[a-z]表示匹配26個字母的任何一個,[a-z].*合起來就是匹配任意多個字符,本題來說就是匹配oldboy字符串,由于oldboy字符串是需要保留的,因此用括號括起來匹配,后面通過\1來取oldboy字符串。
□tea.*$–>表示以空格tea起始,任意字符結尾,實際就是匹配oldboy字符串后,緊接著的字符串□teacher.;
后面被替換的內容中的\1就是取前面的括號里的內容了,也就是我們要的oldboy字符串。
()是擴展正則表達式的元字符,sed軟件默認識別基本正則表達式,想要使用擴展正則需要使用\轉義,即\(\)。sed使用-r選項則可以識別擴展正則表達式,此時使用\(\)反而會出錯。
企業案例4:系統開機啟動項優化
[root@oldboy?~]#?chkconfig?--list|grep?"3:on"|grep?-vE?"sshd|crond|network|rsyslog|sysstat"|awk?'{print?$1}'|sed?-r??'s#^(.*)#chkconfig?\1?off#g'|bash[root@oldboy?~]#?chkconfig?--list|grep?"3:on"crond???????????0:off???1:off???2:on????3:on????4:on????5:on????6:offnetwork?????????0:off???1:off???2:on????3:on????4:on????5:on????6:offrsyslog?????????0:off???1:off???2:on????3:on????4:on????5:on????6:offsshd????????????0:off???1:off???2:on????3:on????4:on????5:on????6:offsysstat?????????0:off???1:on????2:on????3:on????4:on????5:on????6:off2.3.5 特殊符號&代表被替換的內容
[root@oldboy?~]#?sed?'1,3s#C#--&--#g'?person.txt?#→此處&等于C101,oldboy,--C--EO??????#→將1到3行的C替換為--C--102,zhangyao,--C--TO103,yy,--C--OO104,feixue,CFO105,dandan,CIO企業案例5:批量重命名文件
當前目錄下有文件如下所示:
[root@oldboy?test]#?lsstu_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 按行查詢
[root@oldboy?~]#?sed?'2p'?person.txt101,oldboy,CEO102,zhangyao,CTO102,zhangyao,CTO103,Alex,COO104,yy,CFO105,feixue,CIO[root@oldboy?~]#?sed?-n?'2p'?person.txt102,zhangyao,CTO[root@oldboy?~]#?sed?-n?'2,3p'?person.txt102,zhangyao,CTO103,Alex,COO說明:取行就用sed,最簡單[root@oldboy?~]#?sed?-n?'1~2p'?person.txt101,oldboy,CEO103,Alex,COO105,feixue,CIO[root@oldboy?~]#?sed?-n?'p'?person.txt101,oldboy,CEO102,zhangyao,CTO103,yy,COO104,feixue,CFO105,dandan,CIO2.4.2 按字符串查詢
[root@oldboy?~]#?sed?-n?'/CTO/p'?person.txt102,zhangyao,CTO[root@oldboy?~]#?sed?-n?'/CTO/,/CFO/p'?person.txt102,zhangyao,CTO103,Alex,COO104,yy,CFO2.4.3 混合查詢
[root@oldboy?~]#?sed?-n?'2,/CFO/p'?person.txt102,zhangyao,CTO103,Alex,COO104,yy,CFO[root@oldboy?~]#?sed?-n?'/feixue/,2p'?person.txt105,feixue,CIO#→特殊情況,前兩行沒有匹配到feixue,就向后匹配,如果匹配到feixue就打印此行。轉載于:https://blog.51cto.com/1979431/1825701
總結
- 上一篇: Jfinal框架Modal获取属性值非常
- 下一篇: android服务之录音功能