天天看點

SHELL程式設計三劍客之sed指令今日目标一、檔案編輯器知多少二、強悍的sed介紹三、sed使用方法介紹四、練習五、實戰

原文連結:

SHELL程式設計三劍客之sed指令

SHELL程式設計三劍客之sed指令今日目标一、檔案編輯器知多少二、強悍的sed介紹三、sed使用方法介紹四、練習五、實戰

文章目錄

  • 今日目标
  • 一、檔案編輯器知多少
  • 二、強悍的sed介紹
    • 1. sed用來做啥?
    • 2. sed如何處理檔案?
  • 三、sed使用方法介紹
    • 1. 指令行格式
      • (一)文法格式
      • (二)舉例說明
        • ① 對檔案進行增、删、改、查操作
          • 1)列印檔案内容
          • 2)增加檔案内容
          • 3)修改檔案内容
          • 4)删除檔案内容
        • ② 對檔案進行搜尋替換操作
        • ③ 其他指令
        • ④ 其他選項
        • ⑤ sed結合正則使用
    • 2. 腳本格式
      • (一)用法
      • (二)注意事項
      • (三)舉例說明
    • 3. 補充擴充總結
  • 四、練習
  • 五、實戰

今日目标

  • 掌握sed的基本文法結構
  • 熟悉sed常用的指令,如列印p,删除d,插入i等

一、檔案編輯器知多少

  • Windows系統​

    Sublime Notepad++ Word Typora

  • Linux系統

    vim vi gedit nano emacs

二、強悍的sed介紹

1. sed用來做啥?

sed是Stream Editor(流編輯器)的縮寫,簡稱流編輯器;用來處理檔案的。

2. sed如何處理檔案?

sed是一行一行讀取檔案内容并按照要求進行處理,把處理後的結果輸出到螢幕。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-23rWxHXd-1585188551452)(images/sed.png)]

  1. 首先sed讀取檔案中的一行内容,把其儲存在一個臨時緩存區中(也稱為模式空間)
  2. 然後根據需求處理臨時緩沖區中的行,完成後把該行發送到螢幕上

總結:

  1. 由于sed把每一行都存在臨時緩沖區中,對這個副本進行編輯,是以不會直接修改原檔案
  2. Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反複操作,對檔案進行過濾和轉換操作

三、sed使用方法介紹

sed常見的文法格式有兩種,一種叫指令行模式,另一種叫腳本模式。

1. 指令行格式

(一)文法格式

sed [options] ‘處理動作’ 檔案名

  • 常用選項
選項 說明 備注
-e 進行多項(多次)編輯
-n 取消預設輸出 不自動列印模式空間
-r 使用擴充正規表達式
-i 原地編輯(修改源檔案)
-f 指定sed腳本的檔案名
  • 常見處理動作

醜話說在前面:以下所有的動作都要在單引号裡,你敢出軌,回家跪搓衣闆

動作 說明 備注
‘p’ 列印
‘i’ 在指定行之前插入内容 類似vim裡的大寫O
‘a’ 在指定行之後插入内容 類似vim裡的小寫o
‘c’ 替換指定行所有内容
‘d’ 删除指定行

(二)舉例說明

  • 檔案準備
# vim a.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1
           

① 對檔案進行增、删、改、查操作

文法:sed 選項 ‘定位+指令’ 需要處理的檔案
1)列印檔案内容
[[email protected] ~]# sed ''  a.txt						對檔案什麼都不做
[[email protected] ~]# sed -n 'p'  a.txt					列印每一行,并取消預設輸出
[[email protected] ~]# sed -n '1p'  a.txt					列印第1行
[[email protected] ~]# sed -n '2p'  a.txt					列印第2行
[[email protected] ~]# sed -n '1,5p'  a.txt				列印1到5行
[[email protected] ~]# sed -n '$p' a.txt 					列印最後1行
           
2)增加檔案内容

i 位址定位的上面插入

a 下面插入

[[email protected] ~]# sed '$a99999' a.txt 				檔案最後一行下面增加内容
[[email protected] ~]# sed 'a99999' a.txt 				檔案每行下面增加内容
[[email protected] ~]# sed '5a99999' a.txt 				檔案第5行下面增加内容
[[email protected] ~]# sed '$i99999' a.txt 				檔案最後一行上一行增加内容
[[email protected]ocalhost ~]# sed 'i99999' a.txt 				檔案每行上一行增加内容
[[email protected] ~]# sed '6i99999' a.txt 				檔案第6行上一行增加内容
[[email protected] ~]# sed '/^bin/ihello'	a.txt			以bin開頭行的上一行插入内容
           
3)修改檔案内容

c 替換指定的整行内容

[[email protected] ~]# sed '5chello world' a.txt 		替換檔案第5行内容
[[email protected] ~]# sed 'chello world' a.txt 		替換檔案所有内容
[[email protected] ~]# sed '1,5chello world' a.txt 	替換檔案1到5号内容為hello world
[[email protected] ~]# sed '/^bin/c13141314' a.txt	替換以bin開頭的行
           
4)删除檔案内容
[[email protected] ~]# sed '1d' a.txt 					删除檔案第1行
[[email protected] ~]# sed '1,5d' a.txt 					删除檔案1到5行
[[email protected] ~]# sed '$d' a.txt						删除檔案最後一行
[[email protected] ~]# sed '/1.*/d' a.txt 	删除正則比對的所有行
           

② 對檔案進行搜尋替換操作

文法:sed 選項 ‘s/搜尋的内容/替換的内容/動作’ 需要處理的檔案

其中,s表示search搜尋;斜杠**/表示分隔符,可以自己定義;動作一般是列印p和全局替換g**

[[email protected] ~]# sed -n 's/root/ROOT/p' a.txt #将每一行比對的第一個小寫root替換為ROOT
[[email protected] ~]# sed -n 's/root/ROOT/gp' a.txt #将檔案中所有的小寫root替換為ROOT
[[email protected] ~]# sed -n 's/^#//gp' a.txt #将所有#開頭的行的#号去掉
#當要比對的内容包含/, 則以@作為分隔符,或者自定義,但要保證一樣
[[email protected] ~]# sed -n '[email protected]/sbin/[email protected]@gp' a.txt 
[[email protected] ~]# sed -n 's/\/sbin\/nologin/itcast/gp' a.txt
#号為分隔符,10s表示第十行進行替換
[[email protected] ~]# sed -n '10s#/sbin/nologin#itcast#p' a.txt 
uucp:x:10:14:uucp:/var/spool/uucp:itcast
[[email protected] ~]# sed -n '[email protected]/sbin/[email protected]@p' 2.txt 
注意:搜尋替換中的分隔符可以自己指定

[[email protected] ~]# sed -n '1,5s/^/#/p' a.txt 		注釋掉檔案的1-5行内容
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
           

③ 其他指令

指令 解釋 備注
r 從另外檔案中讀取内容
w 内容另存為
& 儲存查找串以便在替換串中引用 和\(\)相同
= 列印行号
對所選行以外的所有行應用指令,放到行數之後 ‘1,5!’
q 退出

舉例說明:

[[email protected] ~]# cat /etc/passwd | head >> 2.txt
[[email protected] ~]# cat 2.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
r	從檔案中讀取輸入行
w	将所選的行寫入檔案
2.txt 第3行讀取檔案/etc/hosts 檔案内容
[[email protected] ~]# sed '3r /etc/hosts' 2.txt 
[[email protected] ~]# sed '$r /etc/hosts' 2.txt
[[email protected] ~]# sed '/root/w a.txt' 2.txt 
[[email protected] ~]# sed '/[0-9]{4}/w a.txt' 2.txt
[[email protected] ~]# sed  -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/w b.txt' 2.txt
[[email protected] tmp]# sed -n 's/^sync/#&/gp' 2.txt 
#sync:x:5:0:sync:/sbin:/bin/sync
[[email protected] tmp]# sed -n 's/^sync/&#/gp' 2.txt 
sync#:x:5:0:sync:/sbin:/bin/sync
[[email protected] tmp]# sed -n 's/\(^sync\)/#\1/gp' 2.txt 
#sync:x:5:0:sync:/sbin:/bin/sync
!	對所選行以外的所有行應用指令,放到行數之後
[[email protected] ~]# sed -n '1!p' 1.txt 
[[email protected] ~]# sed -n '4p' 1.txt 
[[email protected] ~]# sed -n '4!p' 1.txt 
[[email protected] ~]# cat -n 1.txt 
[[email protected] ~]# sed -n '1,17p' 1.txt 
[[email protected] ~]# sed -n '1,17!p' 1.txt 

&   儲存查找串以便在替換串中引用   \(\)

[[email protected] ~]# sed -n '/root/p' a.txt 
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# sed -n 's/root/#&/p' a.txt 
#root:x:0:0:root:/root:/bin/bash

# sed -n 's/^root/#&/p' passwd   注釋掉以root開頭的行
# sed -n -r 's/^root|^stu/#&/p' /etc/passwd	注釋掉以root開頭或者以stu開頭的行
# sed -n '1,5s/^[a-z].*/#&/p' passwd  注釋掉1~5行中以任意小寫字母開頭的行
# sed -n '1,5s/^/#/p' /etc/passwd  注釋1~5行
或者
sed -n '1,5s/^/#/p' passwd 以空開頭的加上#
sed -n '1,5s/^#//p' passwd 以#開頭的替換成空

[[email protected] ~]# sed -n '/^root/p' 1.txt 
[[email protected] ~]# sed -n 's/^root/#&/p' 1.txt 
[[email protected] ~]# sed -n 's/\(^root\)/#\1/p' 1.txt 
[[email protected] ~]# sed -nr '/^root|^stu/p' 1.txt 
[[email protected] ~]# sed -nr 's/^root|^stu/#&/p' 1.txt 


= 	列印行号
# sed -n '/bash$/=' passwd    列印以bash結尾的行的行号
# sed -ne '/root/=' -ne '/root/p' passwd 
# sed -n '/nologin$/=;/nologin$/p' 1.txt
# sed -ne '/nologin$/=' -ne '/nologin$/p' 1.txt

q	退出
# sed '5q' 1.txt
# sed '/mail/q' 1.txt
# sed -r '/^yunwei|^mail/q' 1.txt
[[email protected] ~]# sed -n '/bash$/p;10q' 1.txt
ROOT:x:0:0:root:/root:/bin/bash


綜合運用:
[[email protected] ~]# sed -n '1,5s/^/#&/p' 1.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[[email protected] ~]# sed -n '1,5s/\(^\)/#\1/p' 1.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
           

④ 其他選項

-e 多項編輯
-r	擴充正則
-i 修改原檔案

[[email protected] ~]# sed -ne '/root/p' 1.txt -ne '/root/='
root:x:0:0:root:/root:/bin/bash
1
[[email protected] ~]# sed -ne '/root/=' -ne '/root/p' 1.txt 
1
root:x:0:0:root:/root:/bin/bash

在1.txt檔案中的第5行的前面插入“hello world”;在1.txt檔案的第8行下面插入“哈哈哈哈”

[[email protected] ~]# sed -e '5ihello world' -e '8a哈哈哈哈哈' 1.txt  -e '5=;8=' 

sed -n '1,5p' 1.txt
sed -ne '1p' -ne '5p' 1.txt
sed -ne '1p;5p' 1.txt

過濾vsftpd.conf檔案中以#開頭和空行:
[[email protected] ~]# grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf
[[email protected] ~]# sed -e '/^#/d' -e '/^$/d' /etc/vsftpd/vsftpd.conf
[[email protected] ~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf
[[email protected] ~]# sed -r '/^#|^$/d' /etc/vsftpd/vsftpd.conf

過濾smb.conf檔案中生效的行:
# sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/d' smb.conf
# sed -r '/^(#|$|;|\t#|\t$)/d' smb.conf 

# sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/' smb.conf


[[email protected] ~]# grep '^[^a-z]' 1.txt

[[email protected] ~]# sed -n '/^[^a-z]/p' 1.txt

過濾出檔案中的IP位址:
[[email protected] ~]# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt 
192.168.0.254
[[email protected] ~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 1.txt 
192.168.0.254

[[email protected] ~]# grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 2.txt 
10.1.1.1
10.1.1.255
255.255.255.0

[[email protected] ~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 2.txt
10.1.1.1
10.1.1.255
255.255.255.0
過濾出ifcfg-eth0檔案中的IP、子網路遮罩、廣播位址
[[email protected] tmp]# grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' ifcfg-eth0 
10.1.1.1
255.255.255.0
10.1.1.254
[[email protected] tmp]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|cut -d'=' -f2
10.1.1.1
255.255.255.0
10.1.1.254
[[email protected] tmp]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|sed -n 's/[A-Z=]//gp'
10.1.1.1
255.255.255.0
10.1.1.254

[[email protected] tmp]# ifconfig eth0|sed -n '2p'|sed -n 's/[:a-Z]//gp'|sed -n 's/ /\n/gp'|sed '/^$/d'
10.1.1.1
10.1.1.255
255.255.255.0
[[email protected] tmp]# ifconfig | sed -nr '/([0-9]{1,3}\.)[0-9]{1,3}/p' | head -1|sed -r 's/([a-z:]|[A-Z/t])//g'|sed 's/ /\n/g'|sed  '/^$/d'

[[email protected] tmp]# ifconfig eth0|sed -n '2p'|sed -n 's/.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1\n\2\n\3/p'
10.1.1.1 
10.1.1.255 
255.255.255.0

-i 選項  直接修改原檔案 使用該選項不能用n和p
# sed -i 's/root/ROOT/;s/stu/STU/' 11.txt
# sed -i '17{s/YUNWEI/yunwei/;s#/bin/bash#/sbin/nologin#}' 1.txt
# sed -i '1,5s/^/#&/' a.txt
注意:
-ni  不要一起使用
p指令 不要再使用-i時使用
           

⑤ sed結合正則使用

sed 選項 ’sed指令或者正規表達式或者位址定位’ 檔案名
  1. 定址用于決定對哪些行進行編輯。位址的形式可以是數字、正規表達式、或二者的結合。
  2. 如果沒有指定位址,sed将處理輸入檔案的所有行。
正則 說明 備注
/key/ 查詢包含關鍵字的行 sed -n ‘/root/p’ 1.txt
/key1/,/key2/ 比對包含兩個關鍵字之間的行 sed -n ‘/^adm/,/^mysql/p’ 1.txt
/key/,x 從比對關鍵字的行開始到檔案第x行之間的行(包含關鍵字所在行) sed -n ‘/^ftp/,7p’
x,/key/ 從檔案的第x行開始到與關鍵字的比對行之間的行
x,y! 不包含x到y行
/key/! 不包括關鍵字的行 sed -n ‘/bash$/!p’ 1.txt
[[email protected] tmp]# cat -n 8.txt 
     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
     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
     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	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    12	tcpdump:x:72:72::/:/sbin/nologin
    13	zhangjm:x:500:500:root:/home/zhangjm:/bin/bash
[[email protected] tmp]# sed -n '/^lp,^mail/p' 8.txt 
[[email protected] tmp]# sed -n '/^lp/,/^mail/p' 8.txt 
[[email protected] tmp]# sed -nr '/^lp|^mail/p' 8.txt 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[[email protected] tmp]# sed -nr '/sync/,8p' 8.txt 
[[email protected] tmp]# sed -nr '3,/^halt/p' 8.txt 
           

2. 腳本格式

(一)用法

# sed -f scripts.sh  file		//使用腳本處理檔案
建議使用   ./sed.sh   file

腳本的第一行寫上
#!/bin/sed -f
1,5d
s/root/hello/g
3i777
5i888
a999
p
           

(二)注意事項

1) 腳本檔案是一個sed的指令行清單。'commands'
2) 在每行的末尾不能有任何空格、制表符(tab)或其它文本。
3) 如果在一行中有多個指令,應該用分号分隔。
4) 不需要且不可用引号保護指令
5) #号開頭的行為注釋

           

(三)舉例說明

# cat passwd
stu3:x:509:512::/home/user3:/bin/bash
stu4:x:510:513::/home/user4:/bin/bash
stu5:x:511:514::/home/user5:/bin/bash

# cat sed.sh 
#!/bin/sed -f
2a\
******************
2,$s/stu/user/
$a\
we inster new line
s/^[a-z].*/#&/

[[email protected] ~]# cat 1.sed 
#!/bin/sed -f
3a**********************
$chelloworld
1,3s/^/#&/

[[email protected] ~]# sed -f 1.sed -i 11.txt 
[[email protected] ~]# cat 11.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
**********************
adm:x:3:4:adm:/var/adm:/sbin/nologin
helloworld

           

3. 補充擴充總結

1、正規表達式必須以”/“前後規範間隔
例如:sed '/root/d' file
例如:sed '/^root/d' file

2、如果比對的是擴充正規表達式,需要使用-r選來擴充sed
grep -E
sed -r
+ ? () {n,m} | \d

注意:         
在正規表達式中如果出現特殊字元(^$.*/[]),需要以前導 "\" 号做轉義
eg:sed '/\$foo/p' file

3、逗号分隔符
例如:sed '5,7d' file  				删除5到7行
例如:sed '/root/,/ftp/d' file	
删除第一個比對字元串"root"到第一個比對字元串"ftp"的所有行本行不找 循環執行
       
4、組合方式
例如:sed '1,/foo/d' file			删除第一行到第一個比對字元串"foo"的所有行
例如:sed '/foo/,+4d' file			删除從比對字元串”foo“開始到其後四行為止的行
例如:sed '/foo/,~3d' file			删除從比對字元串”foo“開始删除到3的倍數行(檔案中)
例如:sed '1~5d' file				從第一行開始删每五行删除一行
例如:sed -nr '/foo|bar/p' file	顯示配置字元串"foo"或"bar"的行
例如:sed -n '/foo/,/bar/p' file	顯示比對從foo到bar的行
例如:sed '1~2d'  file				删除奇數行
例如:sed '0-2d'   file				删除偶數行 sed '1~2!d'  file

5、特殊情況
例如:sed '$d' file					删除最後一行
例如:sed '1d' file					删除第一行
	
6、其他:
sed 's/.//' a.txt						删除每一行中的第一個字元
sed 's/.//2' a.txt					删除每一行中的第二個字元
sed 's/.//N' a.txt					從檔案中第N行開始,删除每行中第N個字元(N>2)
sed 's/.$//' a.txt					删除每一行中的最後一個字元


[[email protected] ~]# cat 2.txt 
1 a
2 b
3 c
4 d
5 e
6 f
7 u
8 k
9 o
[[email protected] ~]# sed '/c/,~2d' 2.txt 
1 a
2 b
5 e
6 f
7 u
8 k
9 o

           

四、練習

  1. 将任意數字替換成空或者制表符
  2. 去掉檔案1-5行中的數字、冒号、斜杠
  3. 比對root關鍵字替換成hello itcast,并儲存到test.txt檔案中
  4. 删除vsftpd.conf、smb.conf、main.cf配置檔案裡所有注釋的行及空行(不要直接修改原檔案)
  5. 使用sed指令截取自己的ip位址
  6. 使用sed指令一次性截取ip位址、廣播位址、子網路遮罩
  7. 注釋掉檔案的2-3行和比對到以root開頭或者以ftp開頭的行
1、将檔案中任意數字替換成空或者制表符
2、去掉檔案1-5行中的數字、冒号、斜杠
3、比對root關鍵字的行替換成hello itcast,并儲存到test.txt檔案中
4、删除vsftpd.conf、smb.conf、main.cf配置檔案裡所有注釋的行及空行(不要直接修改原檔案)
5、使用sed指令截取自己的ip位址
# ifconfig eth0|sed -n '2p'|sed -n 's/.*addr://pg'|sed -n 's/Bcast.*//gp'
10.1.1.1  
# ifconfig eth0|sed -n '2p'|sed 's/.*addr://g'|sed 's/ Bcast:.*//g'
6、使用sed指令一次性截取ip位址、廣播位址、子網路遮罩
# ifconfig eth0|sed -n '2p'|sed -n 's#.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)#\1\n\2\n\3#p'
10.1.1.1 
10.1.1.255 
255.255.255.0

7、注釋掉檔案的2-3行和比對到以root開頭或者以ftp開頭的行
# sed -nr '2,3s/^/#&/p;s/^ROOT|^ftp/#&/p' 1.txt
#ROOT:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#3daemon:x:2:2:daemon:/sbin:/sbin/nologin

# sed -ne '1,2s/^/#&/gp' a.txt -nre 's/^lp|^mail/#&/gp'
# sed -nr '1,2s/^/#&/gp;s/^lp|^mail/#&/gp' a.txt
           

五、實戰

1、寫一個初始化系統的腳本

1)自動修改主機名(如:ip是192.168.0.88,則主機名改為server88.itcast.cc)

a. 更改檔案非互動式 sed

/etc/sysconfig/network

b.将本主機的IP截取出來指派給一個變量ip;再然後将ip變量裡以.分割的最後一位指派給另一個變量ip1

2)自動配置可用的yum源

3)自動關閉防火牆和selinux

2、寫一個搭建ftp服務的腳本,要求如下:

1)不支援本地使用者登入 local_enable=NO

2) 匿名使用者可以上傳 建立 删除 anon_upload_enable=YES anon_mkdir_write_enable=YES

3) 匿名使用者限速500KBps anon_max_rate=500000

僅供參考:
#!/bin/bash
ipaddr=`ifconfig eth0|sed -n '2p'|sed -e 's/.*inet addr:\(.*\) Bcast.*/\1/g'`
iptail=`echo $ipaddr|cut -d'.' -f4`
ipremote=192.168.1.10
#修改主機名
hostname server$iptail.itcast.com
sed -i "/HOSTNAME/cHOSTNAME=server$iptail.itcast.com" /etc/sysconfig/network
echo "$ipaddr server$iptail.itcast.cc" >>/etc/hosts
#關閉防火牆和selinux
service iptables stop
setenforce 0 >/dev/null 2>&1
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
#配置yum源(一般是内網源)
#test network
ping -c 1 $ipremote > /dev/null 2>&1
if [ $? -ne 0 ];then
	echo "你的網絡不通,請先檢查你的網絡"
	exit 1
else
	echo "網絡ok."
fi
cat > /etc/yum.repos.d/server.repo << end
[server]
name=server
baseurl=ftp://$ipremote
enabled=1
gpgcheck=0
end

#安裝軟體
read -p "請輸入需要安裝的軟體,多個用空格隔開:" soft
yum -y install $soft &>/dev/null

#備份配置檔案
conf=/etc/vsftpd/vsftpd.conf
\cp $conf $conf.default
#根據需求修改配置檔案
sed -ir '/^#|^$/d' $conf
sed -i '/local_enable/c\local_enable=NO' $conf
sed -i '$a anon_upload_enable=YES' $conf
sed -i '$a anon_mkdir_write_enable=YES' $conf
sed -i '$a anon_other_write_enable=YES' $conf
sed -i '$a anon_max_rate=512000' $conf
#啟動服務
service vsftpd restart &>/dev/null && echo"vsftpd服務啟動成功"

#測試驗證
chmod 777 /var/ftp/pub
cp /etc/hosts /var/ftp/pub
#測試下載下傳
cd /tmp
lftp $ipaddr <<end
cd pub
get hosts
exit
end

if [ -f /tmp/hosts ];then
	echo "匿名使用者下載下傳成功"
	rm -f /tmp/hosts
else
	echo "匿名使用者下載下傳失敗"
fi
#測試上傳、建立目錄、删除目錄等
cd /tmp
lftp $ipaddr << end
cd pub
mkdir test1
mkdir test2
put /etc/group
rmdir test2
exit
end

if [ -d /var/ftp/pub/test1 ];then
    echo "建立目錄成功"
	if [ ! -d /var/ftp/pub/test2 ];then
    	echo "檔案删除成功"
        fi
else
	if [ -f /var/ftp/pub/group ];then
	echo "檔案上傳成功"
        else
        echo "上傳、建立目錄删除目錄部ok"
        fi 
fi   
[ -f /var/ftp/pub/group ] && echo "上傳檔案成功"
           

擷取更多優質内容請關注 景禹

SHELL程式設計三劍客之sed指令今日目标一、檔案編輯器知多少二、強悍的sed介紹三、sed使用方法介紹四、練習五、實戰