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