linux神器sed快速入門,不好用你打我!
為什麼要學習sed
sed(Stream EDitor)被譽為Linux三劍客之一,負責過濾和轉換文字,功能靈活又強大,搭配正則表示式更是如虎添翼。
如果你需要向1000行文字中的某一行後新增新行,如果你需要刪除/查詢文字中從me到you之間的內容,那麼sed命令是你的最佳選擇。
sed命令的工作模式
sed編輯器逐行處理檔案(或輸入),並將結果傳送到螢幕。具體過程如下:首先sed把當前正在處理的行儲存在一個臨時快取區中(也稱為模式空間),然後處理臨時緩衝區中的行,完成後把該行傳送到螢幕上。sed每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入檔案的最後一行後,sed便結束執行。sed把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改原檔案。所以sed編輯器預設不會改動檔案內容。
sed命令的格式
- sed [options] ‘command’ files
- sed [options] -f scriptfile files
常用的options:
-n # 禁止將模式空間(臨時快取區)的內容打印出來
-r # 使用擴充套件正則表示式
-f # 使用檔案,後跟檔名,使用指令碼檔案中的sed動作處理目標檔案
-i # 直接修改檔案內容
-e # 直接在命令列模式下進行sed指令碼命令編輯,預設選項
常用的command:
無地址或單地址command
a /
text # 將text追加到指定/匹配所在行下,若不指定位置會在每行下執行此動作。多個行用反斜槓\加回車隔開
sed '$a \ This is a test for sed.' /etc/group
i /
text # 將text插入指定/匹配所在行之上
sed '$i \ This is a second test for sed.' /etc/group
r filename # 將指定檔案的文字追加到指定位置
sed '$r ./test.sh' /etc/group
接受地址範圍的command:
c \
text # 將text替換選定的範圍的內容
sed '60,64c \ \line 60-64 is empty' /etc/group
d # 將匹配到的行刪除
替換標記s相關命令
格式如下:s/正則/替換內容/標記
其中常用的標記有:
n # 表示替換範圍內第n個目標。
# 某段文字內出現了3次‘abc’,如果把n寫為3,就表示把第三個abc替換掉
g # 表示範圍內全域性替換,如果沒有g則在第一處匹配到的位置完成替換
p # 輸出匹配到的行,一般與option中-n聯用
sed -n 's/zhangsan$/lisi/p' /etc/group # 把/etc/group中以zhangsan結尾的位置替換為李四,並把結果列印到螢幕上
sed命令範例
[root@study_rhel Desktop]# sed '$a \ \ This is a append test for sed.\ ' /etc/group # 在/etc/group行末追加一行文字,前後各空一行 …… apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan This is a append test for sed.
[root@study_rhel Desktop]# sed '$i \ This is a second test for sed.\ Sed is a very powerful tool.' /etc/group # 在/etc/group行末前插入兩行文字 …… zhangsan:x:1001: This is a second test for sed. Sed is a very powerful tool. project:x:1002:zhangsan
[root@study_rhel Desktop]# sed '/^linuxprobe/r /etc/shadow' /etc/group # 匹配以linuxprobe開頭的行並在行後完整插入/etc/shadow中的文字內容 …… linuxprobe:x:1000:linuxprobe # /etc/shadow檔案內容在下一行插入 root:$…… …… zhangsan:$…… # 檔案插入結束 apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan
[root@study_rhel Desktop]# sed '/^linuxprobe/,/^zhangsan/c \ > Both of you were deleted!' /etc/group # 用一段文字替換掉從以linuxprobe開頭的行到以zhangsan開頭的行,起止用逗號隔開 …… postfix:x:89: sshd:x:74: tcpdump:x:72: Both of you were deleted! project:x:1002:zhangsan
已知一個組名project,組內成員有zhangsan。某天需要把linuxprobe也加入此組中,如果此時你作為管理員卻忘記了useradd -G 命令,是否還有其他的方法可以把linuxprobe加入組中?
我們知道/etc/group是使用者組的記錄檔案,先tail檢視一下這個檔案
[root@study_rhel Desktop]# tail -n 3 /etc/group apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan # 以冒號分隔的區段中,最後一段記錄了組內的使用者名稱稱 # 我們可以vim開啟修改這個檔案,更直接的方法是用sed! [root@study_rhel Desktop]# sed -i '/^project/ s/$/,linuxprobe/' /etc/group # 匹配以project開頭的行並在行末把“,linuxprobe”替換上去 [root@study_rhel Desktop]# tail -n 3 /etc/group apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan,linuxprobe [root@study_rhel Desktop]# id linuxprobe uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),1002(project) [root@study_rhel Desktop]# groups linuxprobe linuxprobe : linuxprobe project # linuxprobe的有效群組多了個project [root@study_rhel Desktop]# sed -i '/^project/ s/,linuxprobe$//' /etc/group # 演示完畢,刪掉他,別忘了逗號
sed命令確實很強大吧!但作為系統管理員要有謹慎行事的風格,不要像例子裡一樣搞“歪門邪道”。
PS:這個老爺子屬實躺槍!當年所謂“挾屍要價”的風波中,這個老爺子是給人打工的。大眾被媒體的一張照片所誤導,對這個老人口誅筆伐,老人一度不敢見人。願我們都對資訊和文字懷有敬畏之心。