Linux三劍客-SED

一、Sed是什麼

Sed:字符流編輯器,Stream Editor正則表達式

二、Sed功能與版本

處理日誌文件,日誌,配置文件等緩存

增長、刪除、修改、查詢app

sed --version 能夠經過man sed 來檢驗系統中有沒有安裝sed編輯器

[root@luffy-001 ~]# sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

 

三、語法格式

sed  [選項]  [sed指令]  [輸入文件]測試

sed   -i.bak ‘s#oldboy#oldgirl#g’  oldboy.txtspa

-i  --sed命令的參數3d

s  --sed命令/指令日誌

g  ------小尾巴/修飾code

四、命令執行流程

模式空間:sed從文件讀取一行文本後存入緩存區(這個緩存區在內存中)blog

五、經常使用功能

查詢

建立測試文件

cat>person.txt<<EOF
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF

按行查詢

-n 取消默認輸出

# #一、顯示某一行,單行
[root@luffy-001 oldboy]# sed -n '1p' person.txt 
101,oldboy,CEO
# #若是沒有‘1p’,默認會顯示全部內容
# #二、顯示連續多行
[root@luffy-001 oldboy]# sed -n '2,4p' person.txt 
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
# #三、顯示包含oldboy的行到包含104的行
# #先看包含oldboy的行,記住要使用斜線//包起來
[root@luffy-001 oldboy]# sed -n '/oldboy/p' person.txt 
101,oldboy,CEO
# #顯示包含oldboy的行到以104開頭的行(只用了特殊符號)
[root@luffy-001 oldboy]# sed -n '/oldboy/,/^104/p' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@luffy-001 oldboy]#
# #四、 查詢制定更多行,經過分號隔開
[root@luffy-001 oldboy]# sed -n '2p;4p' person.txt 
102,zhangyao,CTO
104,yy,CFO

 

 

過濾多個字符

-r  sed選項,支持擴展正則表達式(|、()),默認狀況,sed只支持基本正則表達式

sed裏面的正則字符左右必需要用「/」。

sed命令經過正則表達式進行過濾========至關於egrep

 

[root@luffy-001 oldboy]# egrep 'oldboy|yy' person.txt 
101,oldboy,CEO
104,yy,CFO

[root@luffy-001 oldboy]# sed -rn '/oldboy|yy/p' person.txt 
101,oldboy,CEO
104,yy,CFO

 

增長

單行增長

a   追加append,在指定行後面添加一行或者多行文本

i    插入insert,在指定行前面添加一行或者多行文本

 

 

# 在第三行後面增長
[root@luffy-001 oldboy]# sed '3a 103.5,Lee,UFO' person.txt  
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
103.5,Lee,UFO
104,yy,CFO
105,feixue,CIO
# 在第三行前面增長
[root@luffy-001 oldboy]# sed '3i 103.5,Lee,UFO' person.txt  
101,oldboy,CEO
102,zhangyao,CTO
103.5,Lee,UFO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
# 查看文件並無被修改
[root@luffy-001 oldboy]# cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
# $表示最後一行
[root@luffy-001 oldboy]# sed -n '$p' person.txt 
105,feixue,CIO
# 在最後一行加入一行內容new、new、new
[root@luffy-001 oldboy]# sed '$a new,new,new' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
new,new,new
# echo >> 也能夠在文件最後追加單行

 

 

多行增長

# 在最後加上多行(不經常使用,有其餘方法)
[root@luffy-001 oldboy]# sed '$a new,new,new\nold,old,old,old\nwww' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
new,new,new
old,old,old,old
www
# 使用cat命令向文件追加多行
cat >>person.txt<<EOF
new,new,new
old,old,old,old
www
EOF

 

 

刪除

單行刪除

[root@luffy-001 oldboy]# sed '$d' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

 

多行刪除

[root@luffy-001 oldboy]# sed '2,3d' person.txt 
101,oldboy,CEO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed '1,4d' person.txt 
105,feixue,CIO

 

不顯示文件中的空行

[root@luffy-001 oldboy]# cat -n person.txt 
     1    101,oldboy,CEO
     2    
     3    102,zhangyao,CTO
     4    103,Alex,COO
     5    
     6    104,yy,CFO
     7    
     8    105,feixue,CIO
[root@luffy-001 oldboy]# cat -nA person.txt 
     1    101,oldboy,CEO$
     2    $
     3    102,zhangyao,CTO$
     4    103,Alex,COO$
     5    $
     6    104,yy,CFO$
     7    $
     8    105,feixue,CIO$
[root@luffy-001 oldboy]# grep -v '^$' person.txt   使用grep,去反
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed '/^$/d' person.txt    使用sed(正則)刪除空行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed -n '/^$/!p' person.txt   ! 表示去反
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed '$d' person.txt     刪除最後一行
101,oldboy,CEO

102,zhangyao,CTO
103,Alex,COO

104,yy,CFO

[root@luffy-001 oldboy]# sed '$!d' person.txt   刪除不是最後一行的全部行
105,feixue,CIO
[root@luffy-001 oldboy]# 

 

替換

sed  -i   ‘s###g’   person.txt

-i 修改文件   -i.ori 表示自動備份(先備份在修改)

s 單獨使用---->  將每一行匹配的字符進行替換

g 每一行所有替換----> sed指令s的替換標誌之一(全局替換)

如何用sed進行變量替換

###將變量中的內容進行替換(只要考察單雙引號的區別)
#設置變量
[root@luffy-001 oldboy]# x=oldboy
[root@luffy-001 oldboy]# y=oldgirl
[root@luffy-001 oldboy]# 
#替換 使用 符號$
[root@luffy-001 oldboy]# sed 's#$x#$y#g' person.txt 
101,oldboy,CEO

102,zhangyao,CTO
103,Alex,COO

104,yy,CFO

105,feixue,CIO
#必需要使用雙引號
[root@luffy-001 oldboy]# sed "s#$x#$y#g" person.txt 
101,oldgirl,CEO

102,zhangyao,CTO
103,Alex,COO

104,yy,CFO

105,feixue,CIO

 

單引號:所見即所得

雙引號:與單引號相似,特殊符號會被解析 $  $()  `` !

反向引用

()的功能能夠記住正則表達式的一部分

擴展正則,使用 -r

\1 應用第一個小括號中的匹配內容,\2引用第二個小括號中的內容,sed最多能夠記住9個

題目:ehco "i am oldboy teacher" 若是想保留這一行的單詞oldboy

 

擴展

特殊符號 = 獲取行號

[root@luffy-001 oldboy]# sed = person.txt 
1
101,oldboy,CEO
2

3
102,zhangyao,CTO
4
103,Alex,COO
5

6
104,yy,CFO
7

8
105,feixue,CIO

 

一條sed 語句至此那個多條命令

每一個 -e 選項後能夠接一個sed指令

分號的使用

案例:一個文件100行,把5,35,70行單獨拿出來

相關文章
相關標籤/搜索