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>> 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,如需轉載請自行聯系原作者