sed

s下面說的是sed工具

sed本身也是一個管道命令,可以分享standard input 的,而且sed還可以將數據進行替換、刪除、新增、選取特定行等的功能呢,

          選項介紹

sed [-nefr] [動作]

-n:使用安靜模式。在一般sed的用法中,所有來自stdin的數據一般都會列出屏幕上,但如果加上-n參數後,則只有經過sed特殊處理的那一行纔會被列出來。

-e:直接在命令行模式上進行sed的動作編輯

-f:直接將sed的動作寫在一個文件內,-f filename 則可以執行filename內的sed動作

-r:sed的動作支持的是擴展正則表達式的語法(默認是基礎正則表達式語法)

-i:直接修改讀取的文件內容,而不是由屏幕輸出。


動作說明: [n1[,n2]]function

n1,n2:不見得會存在,一般代表選擇進行動作的行數,舉例來說,如果我的動作是需要在10到20行之間進行的,則“10,20[動作行爲]


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

c:替換,c後面的可以接字符串,這些字符串可以替換n1,n2之間的行!

d:刪除,因爲是刪除,所以d後面通常不跟任何參數;

i:插入,i的後面可以接字符串,而這些字符串戶在新的一行出現(目前的上一行)“

p:打印,也就是將某個選擇的數據打印出來,通常p會與參數 sed -n 一起運行;

s:替換,可以直接進行替換的工作。通常這個s的動作可以搭配

正則表達式!例如 1,20s/old/new/g

         案例解說

以行爲單位的新增、刪除功能

  範例1,將/etc/passwd的內容列出並打印行號,同時,請將第2~5行刪除。

[root@localhost ~]# nl /etc/passwd | sed '2,5d'

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

     6sync:x:5:0:sync:/sbin:/bin/sync

     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8halt:x:7:0:halt:/sbin:/sbin/halt

看到了吧?sed的動作爲‘2,5d’,那個d就是刪除。因爲2~5都被刪除了,顯示的數據就沒它們了,另外,原本應該執行sed -e 纔對 沒有 -e 也行,注意後面sed 格式 ‘ ’。

刪除單行就sed ‘#d’ #號表示你刪除的第幾行,要是從第3行刪除到行尾,就sed ‘3,$d'

$代表的是最後一行。


例2.我要在第2行後面加上,hello word,怎麼辦?

[root@localhost ~]# sed '2a hello word' < /etc/passwd

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

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

hello word

daemon:x:2:2:daemon:/sbin:/sbin/nologin

標準輸出給sed,2a就是要在第2行後面添加,hello word,把2a換成2i就表示在第二行的前面添加。

例3 。我們還可以添加多行在裏面,請繼續往下跟着我走,唐僧四人

[root@localhost ~]# nl /etc/passwd | sed '2a sunwukeng\nzhuba\ntangdoudou\nshasha'

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

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

sunwukeng

zhuba

tangdoudou

shasha

要換行就\n;

以行爲單位的替換與顯示功能

例4.我想將2~5行的內容換成"four to kill"請看下面

[root@localhost ~]# nl /etc/passwd | sed '2,5c four to kill'

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

four to kill

     6sync:x:5:0:sync:/sbin:/bin/sync

看見嗎?我來次4殺,2到5 c表示替換,後面的內容,,

例5.我們還可以打印想要的行,我想要第6行,

[root@localhost ~]# nl /etc/passwd | sed -n '6p'

     6sync:x:5:0:sync:/sbin:/bin/sync

這要加-n的,表示安靜,不加-n,會打印全文,打印2次6行,,這樣你就很鬧騰,,

部分數據的查找並替換的功能,、

除了整行的處理模式之外,sed還可以用行爲單位進行部分數據的查找並替換功能,基本上sed的查找與替換與vi相類似,它像這樣子滴:

sed  's/要被替換的字符/被替換的字符/g'

 ///或者###或者@@@  s是搜索, g在全文,

例6.取出ip地址,下面我用grep ,sed,

[root@localhost ~]# ifconfig | grep "netmask" | sed 's/^.*inet[[:space:]]*//g' | sed\ 's/[[:alpha:]].*//g'

127.0.0.1  

192.168.122.1  

找出帶有ip地址的行,然後,就sed替換,這都是套路,把不用的通通替換沒有,刪除,

例7,直接修改文件內容;

你以爲sed只會這樣的功能嗎?大聲說no,sed可以直接修改文件的內容,而不必使用管道命令或數據流重定向。不過這個操作會直接修改文件,所有要慎重,不要拿系統配置文件搞,

[root@localhost ~]# sed -i 's@^@#&@g' /root/bin/4c.sh 

[root@localhost ~]# cat /root/bin/4c.sh

##!/bin/bash

#

#if [ $1 == '--add' ];then

#    for I in `echo $2 | sed 's/,/ /g'`;do

#        if id $I &> /dev/null;then

#        echo "existing"

#        else

#        useradd $I

#    echo "$I" | passwd --stdin $I &> /dev/null

#        echo "finished"

#      fi

#      done

#elif [ $1 == '--del' ];then

#    for I in `echo $2 | sed 's/,/ /g'`;do

#     if id $I &> /dev/null;then

#      userdel -r $I

#      echo "deleting completed"

#      fi

#     done

#else

#    echo "-NOT"

#fi

[root@localhost ~]# 


我一狠心把這腳本每行都註釋了。。這就是改變了內容了。大家要慎獨,慎之又慎;

^表示行首,&就是原來的量,#&就是在行首加#,我解釋是不好,希望你能看明白就好,

tks byby

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