Linux三劍客——sed

第1章 sed知識點

1.1 sed是什麼

字符流編輯器 Stream Editor

sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。

1.2 sed功能與版本

1)處理純文本文件,日誌,配置文件等==>Linux

2)增加、刪除、修改、查詢

3)sed --version

[root@wuhuang ~]# 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: <[email protected]>.

Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

1.3 語法格式

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

sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt

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

s ---sed指令

g ---小尾巴/修飾

1.4 sed 命令運行過程

sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。

第2章 查詢 pprint

2.1 按行查詢

2.1.1 單行

1.   p 打印模式空間的內容

2.   -n 取消默認的sed軟件的輸出

創建環境

[root@wuhuang ~]# cd /wuhuang/

[root@wuhuang wuhuang]# touch person.txt

[root@wuhuang wuhuang]# cat >>person.txt<<EOF

> 101,wuhuang,CEO

> 102,zhangyao,CTO

> 103,Alex,COO

> 104,yy,CFO

> 105,feixue,CIO

> EOF

1: 取具體的某一行   sed -n '3p' person.txt

[root@wuhuang wuhuang]# sed -n '3p' person.txt

103,Alex,COO

2. 顯示文件的最後一行  sed -n '$p' person.txt

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO                                                                                                      

[root@wuhuang wuhuang]# sed -n '$p' person.txt

105,feixue,CIO  

3. 取包含xxx的行

[root@wuhuang wuhuang]# sed -n '/wuhuang/p' person.txt 

101,wuhuang,CEO


2.1.2 多行

1. 連續的多行-地址範圍精講  連續的行使用 ,

沒有地址,默認匹配所有行

sed -n ‘從哪裏來,哪裏去p

  數字 sed -n '1,3p' person.txt

[root@wuhuang wuhuang]# sed -n '1,3p' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

 2. 正則地址範圍-模糊,容易找多了

 正則 sed -n '/wuhuang/p' person.txt

          sed -n '/wuhuang/,/yy/p' person.txt

[root@wuhuang wuhuang]# sed -n '/oldboy/p' person.txt

101,wuhuang,CEO

[root@wuhuang wuhuang]# sed -n '/o.*y/p' person.txt 

101,wuhuang,CEO

[root@wuhuang wuhuang]##顯示包含oldboy的行到包含yy的行

[root@wuhuang wuhuang]# sed -n '/oldboy/,/yy/p' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

3. 不連續的多行 使用 ; 號隔開(使用分號)

[root@wuhuang wuhuang]# #同一行放多個命令用;

[root@wuhuang wuhuang]# sed -n '1p;4p;5p' person.txt 

101,wuhuang,CEO

104,yy,CFO

105,feixue,CIO


2.1.3 過濾多個字符

-r 支持擴展正則表達式

| 擴展正則,同時過濾多個字符

[root@wuhuang wuhuang]# sed -nr '/wuhuang|yy/p' person.txt 

101,wuhuang,CEO

104,yy,CFO sed裏面的正則字符左右必須有“/


第3章 增加

3.1 單行增加

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

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

[root@wuhuang wuhuang]# sed '$a 106,wuxingge,UFO' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

[root@wuhuang wuhuang]# sed '2i 106,wuxingge,UFO\n107,lee,XO' person.txt

101,wuhuang,CEO

106,wuxingge,UFO

107,lee,XO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


3.2 多行增加

換行符 \n

[root@wuhuang wuhuang]# sed '$a 106,wuxingge,UFO\n107,lee,XO' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

107,lee,XO

注:cat 命令多行追加

  echo只能在追加到文件末尾  echo >>

  vim 可以寫入

第4章 刪除

4.1 單行刪除

  d刪除 delete

  $ 代表文件的最後一行

  '1d'  或 '/oldboy/d'

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO  

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@wuhuang wuhuang]# sed '/wuhuang/d' person.txt 

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


4.2 多行刪除

[root@wuhuang wuhuang]# sed '1,4d' person.txt 

105,feixue,CIO

4.3 企業案例:不顯示文件中的空行

1. sed '/^$/d' person.txt

[root@wuhuang wuhuang]# sed -r '/^$/d' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2. grep -v '^$' person.txt

[root@wuhuang wuhuang]# grep -v '^$' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

3. awk '!/^$/' person.txt

[root@wuhuang wuhuang]# awk '!/^$/' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

4. sed -n '/^$/!p' person.txt

[root@wuhuang wuhuang]# sed -n '/^$/!p' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


第5章 替換

5.1 文本替換

5.1.1 sed -i 's#a#b#g' wuhuang.log

  s   單獨使用——>將每一行中第一個匹配的字符串進行替換

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@wuhuang wuhuang]# sed 's#[0-9]#wuhuang#' person.txt 

wuhuang01,wuhuang,CEO

wuhuang02,wuhuang,CTO

wuhuang03,Alex,COO

wuhuang04,yy,CFO

wuhuang05,feixue,CIO

   g   global 每一行進行全部替換——>sed指令s的替換標誌之一(全局替換)

[root@wuhuang wuhuang]# sed 's#[1-9]#AA#g' person.txt

AA0AA,wuhuang,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO


5.1.2 修改文件 -i

  sed -i.bak 's#[1-9]#AA#g' person.txt

  -i.bak  先把文件備份爲 person.txt.bak ,然後再修改文件的內容

   -i   參數要放在sed所有參數最後面

sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt

[root@wuhuang wuhuang]# sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt

[root@wuhuang wuhuang]# cat person.txt

AA0AA,wuhuang,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO

[root@wuhuang wuhuang]# cat person.txt.bak.2018-01-12

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


5.2 變量替換

5.2.1 變量替換

[root@wuhuang wuhuang]# a=wuhuang    定義變量

[root@wuhuang wuhuang]# b=old       定義變量

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@wuhuang wuhuang]# sed "s#$a#$b#g" person.txt   sed使用變量

101,old,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

5.2.2 引號的區別總結

1.單引號-所見即所得

[root@wuhuang wuhuang]# echo 'stu{1..6},`pwd`'

stu{1..6},`pwd`

2.雙引號-對特殊符號進行解析 $ $() ``

[root@wuhuang wuhuang]# echo "stu{1..6},`pwd`"

stu{1..6},/wuhuang

[root@wuhuang wuhuang]# echo "I'm aaa"

I'm aaa                                         

[root@wuhuang wuhuang]# echo 'I'm aaa'

> ^C 想要顯示單引號是需用雙引號

3.不加引號和雙引號一樣,支持通配符{}*.txt

[root@wuhuang wuhuang]# echo stu{1..6},`pwd`

stu1,/wuhuang stu2,/wuhuang stu3,/wuhuang stu4,/wuhuang stu5,/wuhuang stu6,/wuhuang

4.反引號

[root@wuhuang wuhuang]# echo `pwd` ddd

/wuhuang ddd

5.3 反向引用

()的功能可以禁止正則表達式的一部分

擴展正則,使用-r

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

5.3.1 預備知識——sed &

sed &前面正則匹配到的內容

[root@wuhuang wuhuang]# echo 123456|sed -r 's#([0-9])#<\1>#g'

<1><2><3><4><5><6>

[root@wuhuang wuhuang]# echo 123456|sed  's#[0-9]#<&>#g'

<1><2><3><4><5><6>

[root@wuhuang wuhuang]# echo this is a test line | sed 's#.#<&>#g'

<t><h><i><s>< ><i><s>< ><a>< ><t><e><s><t>< ><l><i><n><e>

正則表達式 \w\+ 匹配每一個單詞,使用 <&>替換它,& 對應於之前所匹配到的單詞

[root@wuhuang wuhuang]# echo this is a test line | sed 's#\w\+#<&>#g'

<this> <is> <a> <test> <line>

案例:echo "I am oldboy teacher." 如果想保留這一行的單詞oldboy

[root@wuhuang wuhuang]# echo "I am wuhuang teacher." |sed -r 's#.*(ol.*y).*#\1#g'

wuhuang

5.3.2 命令拼接——解決不會使用循環

/oldboy/下所有.jpg的文件名修改爲.avi

1. 先在屏幕上拼接出目標命令

[root@wuhuang wuhuang]# ls wuhuang*.jpg |sed -r 's#(.*)jpg#mv & \1avi#g'

mv wuhuang01.jpg wuhuang01.avi

mv wuhuang02.jpg wuhuang02.avi

mv wuhuang03.jpg wuhuang03.avi

mv wuhuang06.jpg wuhuang06.avi

mv wuhuang07.jpg wuhuang07.avi

mv wuhuang08.jpg wuhuang08.avi

mv wuhuang09.jpg wuhuang09.avi

mv wuhuang10.jpg wuhuang10.avi

2. 最終交給 |bash執行

[root@wuhuang wuhuang]# ls wuhuang*.jpg |sed -r 's#(.*)jpg#mv & \1avi#g' |bash

[root@wuhuang wuhuang]# ls wuhuang*

wuhuang01.avi  wuhuang03.avi  wuhuang05.avi  wuhuang07.avi  wuhuang09.avi  wuhuang.txt

wuhuang02.avi  wuhuang04.avi  wuhuang06.avi  wuhuang08.avi  wuhuang10.avi

5.4 拓展

5.4.1 rename替換(重命名)

rename     from         to         file...

        你要替換的內容   替換成什麼   替換哪些文件

rename      jpg         avi        *.jpg

[root@wuhuang wuhuang]# rename jpg avi *.jpg

[root@wuhuang wuhuang]# ls

wuhuang01.avi  wuhuang03.avi  wuhuang05.avi  wuhuang07.avi  wuhuang09.avi    

wuhuang02.avi  wuhuang04.avi  wuhuang06.avi  wuhuang08.avi  wuhuang10.avi  

 5.4.2 sed裏面表示非

5.4.3 特殊符號=獲取行號

5.4.4 一條sed語句執行多條命令

第6章 使用sed命令常見的坑

6.1 -r -i同時使用

  -r 參數在前面

-ri  正常

[root@wuhuang wuhuang]# cat ett.txt

wuhuang

wuhuangoooy

test

[root@wuhuang wuhuang]# sed -ri 's#[o]+{2}#AAAA#g' ett.txt

[root@wuhuang wuhuang]# cat ett.txt

wuhuang

wuhuangAAAAy

test

-ir  先把文件備份爲xxr,然後再替換文件中的內容

[root@wuhuang wuhuang]# cat ett.txt

wuhuang

wuhuangoy                                                           源文件內容

test

[root@wuhuang wuhuang]# sed -ir 's#[l]+{2}#o#g' ett.txt       sed -ir先備份 

[root@wuhuang wuhuang]# ll ett.*

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:56 ett.txtr                 備份爲ett.txtr

[root@wuhuang wuhuang]# cat ett.txt                        因爲在上面的命令裏r已經不是參數,所以sed 默認不支持擴展正則,文件沒有被修改,只是備份

wuhuang                                                          

wuhuangoy

test

[root@wuhuang wuhuang]# cat ett.txtr

wuhuang

wuhuangoy

test

[root@wuhuang wuhuang]# sed -rir 's#[l]+{2}#o#g' ett.txt  重新給sed 加上 -r 參數,使 sed支持擴展正則

[root@wuhuang wuhuang]# ll ett.*                                    

-rw-r--r-- 1 root root 19 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txtr                             新備份的文件覆蓋了剛纔的文件

[root@wuhuang wuhuang]# cat ett.txt                                     源文件被替換

wuhuang

wuhuangoy

test

[root@wuhuang wuhuang]# cat ett.txtr                                 備份文件內容不變

wuhuang

wuhuangoy

test

6.2 -i禁止與-n一起使用(回顧sed的執行過程)

 -i-n一起使用會把源文件的內容清空

[root@wuhuang wuhuang]# cat ett.txtr

wuhuang

wuhuangoy

test

[root@wuhuang wuhuang]# sed -ni 's#oldboy#123456#g' ett.txtr

[root@wuhuang wuhuang]# cat ett.txtr |wc -l

0



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章