目錄
- 定義
- 作業流程
- 常見用法
- 常見的sed命令選項主要包含以下幾種
- 常見的操作包含以下幾種
- 輸出內容
- 帶行號輸出所有內容 等同于 cat test.txt
- 輸出第4行,或者3到5行
- 輸出偶數行;奇數行
- 輸出1到6行之間的偶數行,3到9行之間的奇數行
- 輸出以第6行到結尾之間的偶數行(即以第6行為起始行,重新排序設定)
- 輸出包含the的內容
- 輸出從第3行開始到第一個包含the的行(是一個區間程序)
- 輸出包含the的所在行的行號(等號用來輸出行號)
- 輸出以PI為開頭的內容;以0到9數字為結尾的內容
- 輸出包含單詞home的行(<> 代表單詞邊界)
- 洗掉內容
- 洗掉第5行;洗掉2到4行
- 洗掉除了包含單詞home的內容的其它所有行
- 洗掉以a-z小寫字母為開頭的內容
- 洗掉以.為結尾的內容
- 洗掉所有空行
- 替換內容
- 將每行中的第一個the替換為THE
- 將檔案中的所有the替換為THE
- 將每行中的第2個l替換為L
- 將檔案中的所有的o洗掉(替換為空串)
- 在每行行首插入#號
- 在每行行尾插入字串EOF
- 在包含the的每行行首插入#號
- 將包含the的所有行中的o替換為O
- 修改內容
- 將包含the的行遷移至檔案末尾,{;}用于多個操作
- 將第1-4行內容轉移至第16行后
- 將包含the的行另存為檔案out.file
- 將檔案/etc/hostname的內容添加到包含the的每行以后
- 在第三行前面插入一個新行,內容為New
- 在包含the的每行后插入一個新行,內容為New
- 在檔案最后結尾后插入一個新行,內容為New
- 在第三行后插入一個新行,內容為New1,后換行插入一個新行,內容為new2
- 使用腳本編輯檔案
- 使用sed腳本將多個編輯指令存放到檔案中執行
- sed直接操作檔案示例
定義
sed (Stream EDitor)是一個強大而簡單的文本決議轉換工具,可以讀取文本,并根據指定的條件對文本內容進行編輯(洗掉替換,添加,移動等),最后輸出所有行或者僅輸出處理的某些行,
作業流程
- 讀取:sed 從輸入流(檔案,管道,標準輸入)中讀取一行內容并存盤到臨時的快取區中(又稱模式空間,pattern space),
- 執行:默認情況下,所有的sed命令都在模式空間中順序地執行,除非指定了行的地址,否則sed命令將會在所有的行上依次執行,
- 顯示:發送修改后的內容到輸出流,在發送資料后,模式空間將會被清空,
在所有的檔案內容都被處理完成之前,上述程序將重復執行,直至所有內容被處理完,
注:默認情況下所有的sed命令都是在模式空間內執行的,由此輸入的檔案并不會發生任何變化,除非是用重定向存盤輸出,
常見用法
- sed [選項] ‘操作’ 引數
- sed [選項] -f scriptfile 引數
常見的sed命令選項主要包含以下幾種
- -e script(腳本命令) : 指定sed編輯命令
- -f scriptfile(檔案) : 指定的檔案中是sed編輯命令
- -h 或 --help :顯示幫助
- -n,–quiet 或 silent :表示僅顯示處理后的結果
- -i :直接編輯文本檔案(會對檔案產生變化)
常見的操作包含以下幾種
- a: 增加,在當前行下面增加一行指定內容
- c:替換,將選定行替換為指定內容
- d:洗掉,洗掉選定的行
- i:插入,在選定行上面插入一行指定內容
- p:列印,如果同時指定行,表示列印指定行;如果不指定行,則表示列印所有內容;如果有非列印字符,則以ASCII碼輸出,其通常與“-n”選項一起使用,(輸出)
- s:替換,替換指定字符
- y:字符轉換
輸出內容
帶行號輸出所有內容 等同于 cat test.txt
[root@server2 ~]# nl test.txt | sed -n 'p'

輸出第4行,或者3到5行
[root@server2 ~]# nl test.txt | sed -n '4p'
[root@server2 ~]# nl test.txt | sed -n '3,5p

輸出偶數行;奇數行
[root@server2 ~]# nl test.txt | sed -n 'n;p'
[root@server2 ~]# nl test.txt | sed -n 'p;n'

輸出1到6行之間的偶數行,3到9行之間的奇數行
[root@server2 ~]# nl test.txt | sed -n '1,6{n;p}'
[root@server2 ~]# nl test.txt | sed -n '3,9{p;n}'

輸出以第6行到結尾之間的偶數行(即以第6行為起始行,重新排序設定)
[root@server2 ~]# nl test.txt | sed -n '6,${n;p}'

輸出包含the的內容
[root@server2 ~]# sed -n '/the/p' test.txt

輸出從第3行開始到第一個包含the的行(是一個區間程序)
[root@server2 ~]# nl test.txt | sed -n '3,/the/p'

輸出包含the的所在行的行號(等號用來輸出行號)
[root@server2 ~]# sed -n '/the/=' test.txt

輸出以PI為開頭的內容;以0到9數字為結尾的內容
[root@server2 ~]# sed -n '/^PI/p' test.txt
[root@server2 ~]# sed -n '/[0-9]$/p' test.txt

輸出包含單詞home的行(<> 代表單詞邊界)
[root@server2 ~]# sed -n '/\<home\>/p' test.txt
[root@server2 ~]# grep 'home' test.txt

- 注:nl :命令用于計算檔案的行數
洗掉內容
洗掉第5行;洗掉2到4行
[root@server2 ~]# nl test.txt | sed '5d'
[root@server2 ~]# nl test.txt | sed '2,4d'

僅在外部輸出洗掉,不會對源檔案產生影響
洗掉除了包含單詞home的內容的其它所有行
[root@server2 ~]# nl test.txt | sed '/home/!d'
3 The home of Football on BBC Sport online.
洗掉以a-z小寫字母為開頭的內容
[root@server2 ~]# sed '/^[a-z]/d' test.txt

洗掉以.為結尾的內容
[root@server2 ~]# sed '/\.$/d' test.txt

洗掉所有空行
[root@server2 ~]# vi test.txt
[root@server2 ~]# sed '/^$/d' test.txt

替換內容
將每行中的第一個the替換為THE
[root@server2 ~]# sed 's/the/THE/' test.txt


將檔案中的所有the替換為THE
[root@server2 ~]# sed 's/the/THE/g' test.txt

將每行中的第2個l替換為L
[root@server2 ~]# sed 's/l/L/2' test.txt

將檔案中的所有的o洗掉(替換為空串)
[root@server2 ~]# sed 's/o//g' test.txt

在每行行首插入#號
[root@server2 ~]# sed 's/^/#/' test.txt

在每行行尾插入字串EOF
[root@server2 ~]# sed 's/$/EOF/' test.txt

在包含the的每行行首插入#號
[root@server2 ~]# sed '/the/s/^/#/' test.txt

將包含the的所有行中的o替換為O
[root@server2 ~]# sed '/the/s/o/O/g' test.txt

- 注:H:復制到剪切板 g,
- G :將剪切板中的資料覆寫/追加至指定行
- w:保存為檔案
- r:讀取指定檔案
- a:追加指定內容
修改內容
將包含the的行遷移至檔案末尾,{;}用于多個操作
[root@server2 ~]# sed '/the/{H;d};$G' test.txt

將第1-4行內容轉移至第16行后
[root@server2 ~]# sed '1,4{H;d};16G' test.txt

將包含the的行另存為檔案out.file
[root@server2 ~]# sed '/the/w out.file' test.txt
[root@server2 ~]# ls -lh
[root@server2 ~]# cat out.file


將檔案/etc/hostname的內容添加到包含the的每行以后
[root@server2 ~]# sed '/the/r /etc/hostname' test.txt

在第三行前面插入一個新行,內容為New
[root@server2 ~]# sed '3iNew' test.txt

在包含the的每行后插入一個新行,內容為New
[root@server2 ~]# sed '/the/aNew' test.txt

在檔案最后結尾后插入一個新行,內容為New
[root@server2 ~]# sed '$aNew' test.txt

在第三行后插入一個新行,內容為New1,后換行插入一個新行,內容為new2
(中間的\n表示換行)
[root@server2 ~]# sed '4aNew1\nnew2' test.txt

- 注意:\n 和\r的區別:
\n 換行符,是另起一新行(游標換行)
\r 回車符,游標回到一舊行的開頭(覆寫前一個)
使用腳本編輯檔案
使用sed腳本將多個編輯指令存放到檔案中執行
[root@server2 ~]# vi opt.list
1,5H 1到5行剪切
1,5d 1到5行洗掉
17G 17行追加
[root@server2 ~]# sed -f opt.list test.txt

sed直接操作檔案示例
撰寫一個腳本,用來調整vsftpd 服務配置,要求禁止匿名用戶,但允許本地用戶
[root@server2 ~]# useradd dada
[root@server2 ~]# passwd dada
[root@server2 ~]# useradd xiaoxiao
[root@server2 ~]# passwd xiaoxiao
[root@server2 ~]# vi ftp.sh
#!/bin/bash
A=vsftpd
FTP=/etc/vsftpd/vsftpd.conf
yum -y install $A
sed -i -e '/local_enable/s/NO/YES/g' $FTP
sed -i -e '/write_enable/s/NO/YES/g' $FTP
sed -i -e 's/^#chroot_local_user=YES/chroot_local_user=YES/g' $FTP
sed -i '$aallow_writeable_chroot=YES' $FTP
sed -i -e '/listen/s/NO/YES/g' $FTP
sed -i -e '/listen_ipv6/s/YES/NO/g' $FTP
systemctl start $A
netstat -anpt | grep $A
[root@server2 ~]# chmod +x ftp.sh
[root@server2 ~]# ./ftp.sh

客戶機上安裝ftp進行訪問
[root@server1 ~]# yum -y install ftp
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): dada
ftp> exit
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): xiaoxiao
ftp> exit

驗證成功
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/216208.html
標籤:其他
下一篇:shell腳本案例(初級)
