1. 程式人生 > 其它 >linux神器sed快速入門,不好用你打我!

linux神器sed快速入門,不好用你打我!

為什麼要學習sed

sed(Stream EDitor)被譽為Linux三劍客之一,負責過濾和轉換文字,功能靈活又強大,搭配正則表示式更是如虎添翼。

如果你需要向1000行文字中的某一行後新增新行,如果你需要刪除/查詢文字中從me到you之間的內容,那麼sed命令是你的最佳選擇。

sed命令的工作模式

sed編輯器逐行處理檔案(或輸入),並將結果傳送到螢幕。具體過程如下:首先sed把當前正在處理的行儲存在一個臨時快取區中(也稱為模式空間),然後處理臨時緩衝區中的行,完成後把該行傳送到螢幕上。sed每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入檔案的最後一行後,sed便結束執行。sed把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改原檔案。所以sed編輯器預設不會改動檔案內容。

sed命令的格式

  1. sed [options] ‘command’ files
  2. 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:這個老爺子屬實躺槍!當年所謂“挾屍要價”的風波中,這個老爺子是給人打工的。大眾被媒體的一張照片所誤導,對這個老人口誅筆伐,老人一度不敢見人。願我們都對資訊和文字懷有敬畏之心。