1. 程式人生 > >sed工具

sed工具

linux 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行:

[[email protected] ~]$ nl /etc/passwd | sed‘3,5d‘
    1  root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    6  sync:x:5:0:sync:/sbin:/bin/sync
    7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8 halt:x:7:0:halt:/sbin:/sbin/halt
…

刪除存在root字符串的行:

[[email protected] ~]$ nl /etc/passwd | sed‘/root/d‘
    2  bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
…

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

[[email protected] ~]$ nl /etc/passwd | sed‘/root/,/ftp/d‘
   15 nobody:x:99:99:Nobody:/:/sbin/nologin
   16  dbus:x:81:81:System messagebus:/:/sbin/nologin
   17  usbmuxd:x:113:113:usbmuxduser:/:/sbin/nologin
      18 rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
…

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

[[email protected] ~]$ nl /etc/passwd | sed ‘2ajust like it‘
    1  root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
just like it
    3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
…

在第2行之後添加多行數據時需要\符號來分隔需要添加的各行:

[[email protected] ~]$ nl /etc/passwd | sed ‘2ajust like it > you are not alone‘
    1  root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
just like it
you are not alone
     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
…

在第2行之前添加多行數據:

[[email protected] ~]$ nl /etc/passwd | sed ‘2ijust like it you are not alone‘
    1  root:x:0:0:root:/root:/bin/bash
just like it
you are not alone
    2 bin:x:1:1:bin:/bin:/sbin/nologin
…

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

[[email protected] ~]$ nl /etc/passwd | sed‘2,6c data line 2-6‘
    1  root:x:0:0:root:/root:/bin/bash
data line 2-6
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8 halt:x:7:0:halt:/sbin:/sbin/halt
…

單獨打印3-6行:

[[email protected] ~]$ nl /etc/passwd | sed-n  ‘3,6p‘
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6  sync:x:5:0:sync:/sbin:/bin/sync
…

如果不添加-n參數,則會全部打印並且3,6行會重復打印:

[[email protected] ~]$ nl /etc/passwd | sed‘3,6p‘   
    1  root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6  sync:x:5:0:sync:/sbin:/bin/sync
    6  sync:x:5:0:sync:/sbin:/bin/sync
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8  halt:x:7:0:halt:/sbin:/sbin/halt
    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
…

替換字符

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

查看/sbin/ifconfig中存在inet addr字符串的行:

[[email protected] ~]$ /sbin/ifconfig eth0 |grep ‘inet addr‘
         inet addr:192.168.21.130 Bcast:192.168.21.255 Mask:255.255.255.0

將上面的數據行中從開頭位置到add:的內容刪除:

[[email protected] ~]$ /sbin/ifconfig eth0 |grep ‘inet addr‘ | sed ‘s/^.*addr://g‘
192.168.21.130  Bcast:192.168.21.255  Mask:255.255.255.0

將之前查詢出來的數據從開頭到add:之間的內容和Bcast到結尾之間的內容刪除:

[[email protected] ~]$ /sbin/ifconfig eth0 |grep ‘inet addr‘ | sed ‘s/^.*addr://g‘| sed ‘s/Bcast.*$//g‘
192.168.21.130

將文件中存在MAN的數據行中#符號及其之後的內容刪除(刪除後發現文件中存在大量空白行):

[[email protected] ~]$ cat  ./man.config.b | grep ‘MAN‘ | sed ‘s/#.*//g‘
 
 
 
 
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man
 
 
 
 
 
MANPATH_MAP     /sbin                   /usr/share/man
MANPATH_MAP     /usr/bin                /usr/share/man
MANPATH_MAP     /usr/sbin               /usr/share/man
MANPATH_MAP     /usr/local/bin          /usr/local/share/man
MANPATH_MAP     /usr/local/sbin         /usr/local/share/man
MANPATH_MAP     /usr/X11R6/bin          /usr/X11R6/man
MANPATH_MAP     /usr/bin/X11            /usr/X11R6/man
MANPATH_MAP     /usr/bin/mh             /usr/share/man
 
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

將文件中存在MAN的數據行中#符號及其之後的內容刪除並且刪除空白行(^$為正則表達式表示空白行):

[[email protected] ~]$ cat  ./man.config.b | grep ‘MAN‘ | sed‘s/#.*//g‘|sed ‘/^$/d‘
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man
MANPATH_MAP     /sbin                   /usr/share/man
MANPATH_MAP     /usr/bin                /usr/share/man
MANPATH_MAP     /usr/sbin               /usr/share/man
MANPATH_MAP     /usr/local/bin          /usr/local/share/man
MANPATH_MAP     /usr/local/sbin         /usr/local/share/man
MANPATH_MAP     /usr/X11R6/bin          /usr/X11R6/man
MANPATH_MAP     /usr/bin/X11            /usr/X11R6/man
MANPATH_MAP     /usr/bin/mh             /usr/share/man
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

直接修改文件:

添加-i參數可以利用sed直接對文件進行操作,這對於大文件很有用,這可以很方便替換,刪除,添加大量數據。

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

[[email protected] ~]$ sed -i ‘s/\.$/\!/g‘man.config.b
[[email protected] ~]$ cat man.config.b
#
# Generated automatically from man.conf.inby the
# configure script!
#
# man.conf from man-1.6f
#
# For more information about this file, seethe man pages man(1)
# and man.conf(5)!
…

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

[[email protected] ~]$ sed -i ‘$a #just add aline to test‘ man.config.b  
[[email protected] ~]$ cat man.config.b | tail-n 5
# Otherwise the database will be updated!
#
# Set up PATH to MANPATH mapping
#MAKEWHATISDBUPDATES    n
#just add a line to test


本文出自 “天黑順路” 博客,請務必保留此出處http://mjal01.blog.51cto.com/12140495/1959348

sed工具