天天看點

sed工具

sed工具可以将進行資料的替換,删除,選取特定行等功能。

文法:

sed [-nref] ‘[n1[,n2]]function’

參數:

-n:在一般的sed的用法中,所有來自标準輸入的資料行一般後會被列出到螢幕上,但是如果加上-n參數,就隻會顯示經過sed特殊處理的那部分資料。

-e:直接在指令行模式上進行sed的動作。

-f:直接将sed的動作寫在一個檔案内,-f filename則可以執行filename内的sed動作。

-r:sed的動作支援的是擴充型正規表達式的文法(預設是基礎的正規表達式)。

-i:直接修改讀取的檔案内容,而不是由螢幕輸出。

n1,n2:可以不存在這兩個數字,代表選擇進行sed動作的行數。2,5表示将在2-5行資料上進行sed動作。

function參數:

a 新增,a後面可以接字元串,這些字元串會在新的一行出現(目前行的下一行)

c 替換,c後面可以接字元串,這些字元串可以替換n1,n2之間的行。

d 删除 d後面一般不接任何參數

i  插入 i後面可以是字元串,這些字元串會在新的一行出現(目前行的上一行)

p 列印 也就是将某個選擇的資料列印出來,通常p會與參數sed -n 一起運作

s 替換,可以直接進行替換的工作,通過這個s的動作可以搭配正規表達式。

删除3-5行:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code><code>'3,5d'</code>

<code>    </code><code>1  root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>    </code><code>2 bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>

<code>    </code><code>6  </code><code>sync</code><code>:x:5:0:</code><code>sync</code><code>:</code><code>/sbin</code><code>:</code><code>/bin/sync</code>

<code>    </code><code>7  </code><code>shutdown</code><code>:x:6:0:</code><code>shutdown</code><code>:</code><code>/sbin</code><code>:</code><code>/sbin/shutdown</code>

<code>    </code><code>8 halt:x:7:0:halt:</code><code>/sbin</code><code>:</code><code>/sbin/halt</code>

<code>…</code>

删除存在root字元串的行:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code><code>'/root/d'</code>

<code>    </code><code>2  bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>

<code>    </code><code>3 daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>

<code>    </code><code>4 adm:x:3:4:adm:</code><code>/var/adm</code><code>:</code><code>/sbin/nologin</code>

删除root到ftp之間的行(包含root,ftp所在的行):

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code><code>'/root/,/ftp/d'</code>

<code>   </code><code>15 nobody:x:99:99:Nobody:/:</code><code>/sbin/nologin</code>

<code>   </code><code>16  dbus:x:81:81:System messagebus:/:</code><code>/sbin/nologin</code>

<code>   </code><code>17  usbmuxd:x:113:113:usbmuxduser:/:</code><code>/sbin/nologin</code>

<code>      </code><code>18 rtkit:x:499:499:RealtimeKit:</code><code>/proc</code><code>:</code><code>/sbin/nologin</code>

在第2行之後添加just like it:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code> <code>'2ajust like it'</code>

<code>just like it</code>

<code>    </code><code>3  daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>

在第2行之後添加多行資料時需要\符号來分隔需要添加的各行:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code> <code>'2ajust like it \</code>

<code>&gt; you are not alone'</code>

<code>you are not alone</code>

<code>     </code><code>3 daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>

在第2行之前添加多行資料:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code> <code>'2ijust like it \</code>

<code>you are not alone'</code>

将2-6行替換為data line 2-6:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code><code>'2,6c data line 2-6'</code>

<code>data line 2-6</code>

<code>    </code><code>7 </code><code>shutdown</code><code>:x:6:0:</code><code>shutdown</code><code>:</code><code>/sbin</code><code>:</code><code>/sbin/shutdown</code>

單獨列印3-6行:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code><code>-n  </code><code>'3,6p'</code>

<code>    </code><code>5 lp:x:4:7:lp:</code><code>/var/spool/lpd</code><code>:</code><code>/sbin/nologin</code>

如果不添加-n參數,則會全部列印并且3,6行會重複列印:

<code>[whx@localhost ~]$ </code><code>nl</code> <code>/etc/passwd</code> <code>| </code><code>sed</code><code>'3,6p'</code>   

<code>    </code><code>5  lp:x:4:7:lp:</code><code>/var/spool/lpd</code><code>:</code><code>/sbin/nologin</code>

<code>    </code><code>8  halt:x:7:0:halt:</code><code>/sbin</code><code>:</code><code>/sbin/halt</code>

<code>    </code><code>9 mail:x:8:12:mail:</code><code>/var/spool/mail</code><code>:</code><code>/sbin/nologin</code>

替換字元

sed ‘/s/被替換的字元串/新的字元串/g’ ,使用sed替換字元通常可以與正規表達式一起使用。

檢視/sbin/ifconfig中存在inet addr字元串的行:

<code>[whx@localhost ~]$ </code><code>/sbin/ifconfig</code> <code>eth0 |</code><code>grep</code> <code>'inet addr'</code>

<code>         </code><code>inet addr:192.168.21.130 Bcast:192.168.21.255 Mask:255.255.255.0</code>

将上面的資料行中從開頭位置到add:的内容删除:

<code>[whx@localhost ~]$ </code><code>/sbin/ifconfig</code> <code>eth0 |</code><code>grep</code> <code>'inet addr'</code> <code>| </code><code>sed</code> <code>'s/^.*addr://g'</code>

<code>192.168.21.130  Bcast:192.168.21.255  Mask:255.255.255.0</code>

将之前查詢出來的資料從開頭到add:之間的内容和Bcast到結尾之間的内容删除:

<code>[whx@localhost ~]$ </code><code>/sbin/ifconfig</code> <code>eth0 |</code><code>grep</code> <code>'inet addr'</code> <code>| </code><code>sed</code> <code>'s/^.*addr://g'</code><code>| </code><code>sed</code> <code>'s/Bcast.*$//g'</code>

<code>192.168.21.130</code>

将檔案中存在MAN的資料行中#符号及其之後的内容删除(删除後發現檔案中存在大量空白行):

<code>[whx@localhost ~]$ </code><code>cat</code>  <code>.</code><code>/man</code><code>.config.b | </code><code>grep</code> <code>'MAN'</code> <code>| </code><code>sed</code> <code>'s/#.*//g'</code>

<code> </code> 

<code>MANPATH </code><code>/usr/man</code>

<code>MANPATH </code><code>/usr/share/man</code>

<code>MANPATH </code><code>/usr/local/man</code>

<code>MANPATH </code><code>/usr/local/share/man</code>

<code>MANPATH </code><code>/usr/X11R6/man</code>

<code>MANPATH_MAP     </code><code>/sbin</code>                   <code>/usr/share/man</code>

<code>MANPATH_MAP     </code><code>/usr/bin</code>                <code>/usr/share/man</code>

<code>MANPATH_MAP     </code><code>/usr/sbin</code>               <code>/usr/share/man</code>

<code>MANPATH_MAP     </code><code>/usr/local/bin</code>          <code>/usr/local/share/man</code>

<code>MANPATH_MAP     </code><code>/usr/local/sbin</code>         <code>/usr/local/share/man</code>

<code>MANPATH_MAP     </code><code>/usr/X11R6/bin</code>          <code>/usr/X11R6/man</code>

<code>MANPATH_MAP     </code><code>/usr/bin/X11</code>            <code>/usr/X11R6/man</code>

<code>MANPATH_MAP     </code><code>/usr/bin/mh</code>             <code>/usr/share/man</code>

<code>MANSECT        1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x</code>

将檔案中存在MAN的資料行中#符号及其之後的内容删除并且删除空白行(^$為正規表達式表示空白行):

<code>[whx@localhost ~]$ </code><code>cat</code>  <code>.</code><code>/man</code><code>.config.b | </code><code>grep</code> <code>'MAN'</code> <code>| </code><code>sed</code><code>'s/#.*//g'</code><code>|</code><code>sed</code> <code>'/^$/d'</code>

直接修改檔案:

添加-i參數可以利用sed直接對檔案進行操作,這對于大檔案很有用,這可以很友善替換,删除,添加大量資料。

将man.config.b中以每行末尾的.符号替換為!:

<code>[whx@localhost ~]$ </code><code>sed</code> <code>-i </code><code>'s/\.$/\!/g'</code><code>man</code><code>.config.b</code>

<code>[whx@localhost ~]$ </code><code>cat</code> <code>man</code><code>.config.b</code>

<code>#</code>

<code># Generated automatically from man.conf.inby the</code>

<code># configure script!</code>

<code># man.conf from man-1.6f</code>

<code># For more information about this file, seethe man pages man(1)</code>

<code># and man.conf(5)!</code>

在man.config.b的末尾添加#justadd a line to test:

<code>[whx@localhost ~]$ </code><code>sed</code> <code>-i </code><code>'$a #just add aline to test'</code> <code>man</code><code>.config.b  </code>

<code>[whx@localhost ~]$ </code><code>cat</code> <code>man</code><code>.config.b | </code><code>tail</code><code>-n 5</code>

<code># Otherwise the database will be updated!</code>

<code># Set up PATH to MANPATH mapping</code>

<code>#MAKEWHATISDBUPDATES    n</code>

<code>#just add a line to test</code>

本文轉自 天黑順路 51CTO部落格,原文連結:http://blog.51cto.com/mjal01/1959348,如需轉載請自行聯系原作者