天天看點

Linux叢集和自動化維2.4.1 sed的基礎文法格式

<b>2.4.1 sed的基礎文法格式</b>

sed的文法格式如下所示:

sed [-nefr]

[n1,n2] 動作

其中:

-n是安靜模式,隻有經過sed處理過的行才會顯示出來,其他不顯示。

-e表示直接在指令行模式上進行sed的操作。貌似是預設選項,不用寫。

-f将sed的操作寫在一個檔案裡,用的時候 -f filename 就可以按照内容進行sed操作了。

-r表示使sed支援擴充正規表達式。

-i表示直接修改讀取的檔案内容,而不是輸出到終端。

n1,n2表示選擇要進行處理的行,不是必需的。10,20表示在10~20行之間處理。

sed格式中的動作支援如下參數。

a:表示添加,後接字元串,添加到目前行的下一行。

c:表示替換,後接字元串,用它替換n1到n2之間的行。

d:表示删除符合模式的行,它的文法為sed '/regexp/d',//之間是正規表達式,模式在d前面,d後面一般不接任何内容。

i:表示插入,後接字元串,添加到目前行的上一行。

p:表示列印,列印選擇的某個資料,通常與-n(安靜模式)一起使用。

s:表示搜尋,還可以替換,類似于vim裡的搜尋替換功能。例如:“1,20s/old/new/g”表示将1~20行的old替換為new,g在這裡表示處理這一行所有比對的内容。

動作最好用' '括起來,防止因空格導緻錯誤。

sed的基礎執行個體如下(下面的所有執行個體在centos 6.4 x86_64下已認證,這裡提前将/etc/passwd拷貝到/tmp目錄下)。

1)顯示 passwd内容,将2~5行删除後顯示,指令如下所示:

cat -n

/tmp/passwd |sed '2,5d'

     1   root:x:0:0:root:/root:/bin/bash

     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

    10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11  operator:x:11:0:operator:/root:/sbin/nologin

    12  games:x:12:100:games:/usr/games:/sbin/nologin

    13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

    14  ftp:x:14:50:ftp

user:/var/ftp:/sbin/nologin

    15  nobody:x:99:99:nobody:/:/sbin/nologin

    16  vcsa:x:69:69:virtual

console memory owner:/dev:/sbin/nologin

    17  saslauth:x:499:76:"saslauthd

user":/var/empty/saslauth:/sbin/nologin

    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    19  sshd:x:74:74:privilege-separated

ssh:/var/empty/sshd:/sbin/nologin

    20  puppet:x:52:52:puppet:/var/lib/puppet:/sbin/nologin

    21  ntp:x:38:38::/etc/ntp:/sbin/nologin

    22  nagios:x:500:500::/home/nagios:/bin/bash

    23  apache:x:48:48:apache:/var/www:/sbin/nologin

    24  nginx:x:498:499:nginx

user:/var/cache/nginx:/sbin/nologin

2)在第2行後面的一行加上“hello,world”字元串,指令如下所示:

/tmp/passwd |sed '2a hello,world'

顯示結果如下所示:

     2   bin:x:1:1:bin:/bin:/sbin/nologin

hello,world

     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

    21  ntp:x:38:38::/etc/ntp:/sbin/nologin

3)在第2行後面一行加上兩行字,例如:“this is first line!”和 “this is second line!”,指令如下所示:

/tmp/passwd |sed '2a this is first line! \  

//使用續航符\後按回車輸入後續行

&gt; this is

second line!'     // 以' 再回車結束

this is first

line!

this is second

4)将2~5行的内容替換成“i am a

good man!”,指令如下所示:

/tmp/passwd | sed '2,5c i am a good man!'

i am a good man!

5)隻顯示5~7行,注意p 與-n的配合使用,指令如下所示:

/etc/passwd |sed -n '5,7p'

6)使用ifconfig列出ip,我們隻想要eth0的ip位址,是以可以先用ifconfig eth0檢視網卡eth0的位址,指令如下所示:

ifconfig eth0

eth0      link encap:ethernet  hwaddr 00:16:3e:7f:67:c3 

          inet addr:192.168.1.207  bcast:192.168.1.255  mask:255.255.255.0

          inet6 addr:

fe80::216:3eff:fe7f:67c3/64 scope:link

          up broadcast running multicast  mtu:1500 

metric:1

          rx packets:11168717 errors:0

dropped:0 overruns:0 frame:0

          tx packets:83863 errors:0 dropped:0

overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          rx bytes:659653034 (629.0 mib)  tx bytes:36972729 (35.2 mib)

          interrupt:24

lo        link encap:local loopback 

          inet addr:127.0.0.1  mask:255.0.0.0

          inet6 addr: ::1/128 scope:host

          up loopback running  mtu:16436 

          rx packets:34 errors:0 dropped:0

overruns:0 frame:0

          tx packets:34 errors:0 dropped:0

          collisions:0 txqueuelen:0

          rx bytes:2716 (2.6 kib)  tx bytes:2716 (2.6 kib)

我們可以先用grep 取出有ip的那一行,然後用sed去掉(替換成空)ip前面和後面的内容,指令如下所示:

ifconfig eth0 |

grep "inet addr" | sed 's/^.*addr://g' | sed 's/bcast.*$//g'

指令顯示結果如下所示:

172.30.171.35

這裡解釋下這行組合指令:

grep 後面緊跟"inet addr"是為了單獨捕獲包含ipv4的那行内容;'^.*addr:' 表示從開頭到addr:的字元串,将它替換為空;'bcast.*$'

表示從bcast到結尾的串,也将它替換為空,然後就隻剩下ipv4位址。

另外一種更簡便的方法是使用awk,指令如下所示:

grep "inet addr:"|awk -f[:" "]+ '{print $4}'

192.168.1.207

awk -f[:"

"]的意思就是以“:”或空格符作為分隔符,然後列印出第4列,這裡有些朋友可能會有疑惑:為什麼不直接以如下方法來擷取ip呢:

grep "inet addr:" | awk -f: '{print $2}'

大家可以看下結果,得出的結果是:

192.168.1.207  bcast

是以還需要再進行一步操作,如下:

grep "inet addr:" | awk -f: '{print $2}' | awk '{print $1}'

希望大家通過這個例子好好總結一下sed的經典用法,第二種方法其實是awk的方法,awk也是一種優秀的編輯器,現多用于截取文本字段的列。

7)在/etc/man.config中,将有man的設定取出,但不要說明内容。指令如下所示:

cat

/etc/man.config |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  /bin            /usr/share/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

注意,#不一定要出現在行首。 是以,/#.*$/表示#和後面的資料(直到行尾)是一行注釋,将它們替換成空。/^$/ 表示空行,後接d 表示删除空行。

删除空行不能用替換方法,因為空行替換成空後,還是有換行符在那一行中。

以上就是sed的幾種常見的文法指令,希望大家結合下面的執行個體,多在自己的機器上演練,以盡快熟練掌握其用法。