1. 程式人生 > >Linux常用命令——sed

Linux常用命令——sed

一次 9.png num edit sta bak RoCE 空白 開頭

sed 字符流編輯器

sed 是Stream Editor(字符流編輯器)的縮寫,簡稱劉編輯器。
sed 是操作、過濾和轉換文本內容的強大的工具。常用功能包括對文件實現快速增刪改查,其中查詢的功能中最常用的兩大功能是過濾(過濾制定字符串)取行(取出指定行)
語法格式:sed【選項】【sed內置命令字符】【輸入文件】
註意:
1.sed 以及後面的選項、命令和輸出文件,每個元素之間都要至少要有一個空格

參數選項:

參數 說明
-i 直接修改文件內容
-n 靜默模式,僅打印和sed命令匹配的內容
-r 支持擴展表達式(預設是基礎正規表示法語法)
-e 直接在命令行模式上進行sed動作編輯,此為默認選項
-f 將sed的動作寫在一個文件內,用–f filename 執行filename內的sed動作
-V -V或--version 顯示版本信息

動作參數說明:

參數 簡述 詳情
a\ 新增 在當前行下面插入文本
c\ 取代 把選定的行改為新的文本
i\ 插入 在當前行上面插入文本
d 刪除 刪除選擇的行
p 打印 打印模板塊的行,通常 p 會與參數 sed -n 一起運行
s 取代 替換指定字符,例如 1,20 s/old/new/g
g 替換 表示行內全面替換
y 更新 表示把一個字符翻譯為另外的字符(但是不用於正則表達式)
r 文件 從目標文件中讀取

sed 元字符集

字符集 說明 案例
\^ 錨定行的開始 如:‘^grep‘ 匹配所有以 grep 開頭的行
$ 錨定行的結束 如:‘grep$‘ 匹配所有以 grep 結尾的行
. 匹配一個非換行符的字符 如:‘gr.p‘ 匹配 gr 後接一個任意字符,然後是 p
* 匹配零個或多個先前字符 如:‘ *grep‘ 匹配所有一個或多個空格後緊跟 grep 的行。 .* 一起用代表任意字符
[ ] 匹配一個指定範圍內的字符 如:‘[Gg]rep‘ 匹配 Grep 和 grep
[^ ] 匹配一個不在指定範圍內的字符 如:‘[^A-FH-Z]rep‘ 匹配不包含 A-F 和 H-Z 的一個字母開頭,緊跟 rep 的行
\(..\) 標記匹配字符 如:‘(love)‘,love 被標記為1
& 保存搜索字符用來替換其他字符 如s/love/&/,love這成love
\< 錨定單詞的開始 如:‘\<grep‘ 匹配包含以grep開頭的單詞的行
\> 錨定單詞的結束 如:‘grep\>‘ 匹配包含以grep結尾的單詞的行
x{m} 連續重復字符 x,m 次 如:‘o{5}‘ 匹配包含連續5個o的行
x{m,} 連續重復字符 x,至少 m 次 如:‘o{5,}‘ 匹配至少連續有5個 o 的行
x{m,n} 連續重復字符 x,至少 m 次,不多於 n 次 如:‘o{5,10}‘ 匹配連續 5-10 個 o 的行
[:digit:] 所有數字, 相當於0-9 如:[0-9]---> [[:digit:]]
[:lower:] 所有的小寫字母 如:[a-z]---> [[:lower:]]
[:upper:] 所有的大寫字母 如:[A-Z]---> [[:upper:]]
[:alpha:] 所有的字母 如:[A-Za-z]---> [[:alpha:]]
[:alnum:] 非特殊符號,相當於0-9a-zA-Z 如:[0-9a-zA-Z]---> [[:alnum:]]
[:space:] 空白字符 如:[ ]---> [[:space:]]
[:punct:] 所有標點符號 如:[^0-9a-zA-Z]---> [[:punct:]]

註意:擴展正則表達式必須結合 -r 選項

常用:命令 sed 替換用法舉例

源文件
技術分享圖片
示例:

序號 指令 說明
sed -i ‘/news/c HAPPY‘ bak.txt 匹配 news 字符的行,替換成 HAPPY 的行
sed -i ‘s#static#stop#‘ bak.txt 把 static 字符替換成 stop 字符
sed -i ‘/server/s#68\.1#76\.3#‘ bak.txt 匹配 server 的字符行,把 68.1 替換成 76.3 由於點號有特殊意義所有需要轉義
sed -i ‘s#lp#LP#2g‘ bak.txt 把所有匹配到 的行中第二次及以後出現的 on 字符替換成 ysg 字符
sed -i ‘s#root#tom#2p‘ bak.txt 把所有匹配到字符 bin 的行中第二次出現的 root 替換成 tom 字符,並再生產與匹配行同樣的行
sed -i ‘s#games#GAMES#2‘ bak.txt 把所有匹配到字符 usr 的行,第三次出現的 usr 替換成 USR 字符
sed -i ‘/sys/{s#/dev#/log#;s#3#6#g}‘ bak.txt 匹配字符 sys 的行,把字符 dev 替換成 log 字符,且把 3 替換成 6
sed -i ‘s#nologin#(&)#g‘ bak.txt 把 nologin 用括號括起來,& 表示引用前面匹配的字符
sed -i ‘s/sys:x/#&/g‘ bak.txt 匹配字符 sys:x 的行前面添加 # 號
sed -i ‘/tcp/s#;# #g‘ bak.txt 匹配字符 tcp 的行,把分號替換成空,也可用於去註釋 # 號

改變後的
技術分享圖片

常用:命令 sed 簡單變量舉例

引用變量
技術分享圖片
技術分享圖片
註意:當sed命令也有默認變量時,在去引用自己定義的變量會出現語法錯誤
註意:當sed命令裏面沒有默認的變量時可以把單引號改成雙引號當sed命令裏面有默認的變量時,那自己定義的變量需要加單引號,且sed裏面的語句必須用單引

進階:命令 sed 的高級使用

案例一
正在操作的內容行寫入到文件中
技術分享圖片
技術分享圖片
指定行號添加內容
技術分享圖片
案例二
獲取域名信息
源文件與結果樣式
cat yuming.txt|sed ‘s#http:\/\/##;s#\/.*##‘|sort|uniq -c|sort -rn
awk -F/ ‘{print $3}‘ yuming.txt|sort -r|uniq -c|awk ‘{print $1"\t",$2}‘
技術分享圖片
技術分享圖片

命令參數用法舉例

案例一
參數 -n 舉例
技術分享圖片
註意:在不加 -n 時,檢索到的行重復打印兩遍,原因是 sed 默認會打印文件中的所有行
技術分享圖片
技術分享圖片
註意:當使用多個 sed 編輯命令時,需用 {} 並用分號進行分隔

案例二
動作參數 -s 舉例
在匹配的行尾添加 book 字符
技術分享圖片
技術分享圖片
在 is 字符前添加 ysg
技術分享圖片
技術分享圖片
動作參數 -i 舉例
技術分享圖片
動作參數 -a 舉例
技術分享圖片
動作參數 -d 舉例
技術分享圖片
註意:在不適用 -i 參數時,原文本不會被修改,當使用 -i 參數時表示寫入並修改文本,參數 -e 表示直接在命令行模式上進行sed動作編輯,此為默認選項
案例三
sed 的正則表達式舉例

舉例 說明
sed ‘5 q‘ /etc/passwd 打印前 5 行
sed -n ‘1,3p‘ /etc/passwd 打印 1-3 行
sed -n ‘/r*t/p‘ /etc/passwd 打印匹配r有 0 個或者多個,後接一個 t 字符的行
sed -n ‘/.r.*/p‘ /etc/passwd 打印匹配有r的行並且r後面跟任意字符
sed -n ‘/o*/p‘ /etc/passwd 打印o字符重復任意次
sed -n ‘/o\{1,\}/p ‘ /etc/passwd 打印o字重復出現一次以上
sed -n ‘/o\{1,3\}/p ‘ /etc/passwd 打印o字重復出現一次到三次之間以上
sed -n ‘/^#/!p‘ /etc/vsftpd/vsftpd.conf 打印以 # 開頭的行,進行取反,已達到過濾註釋的效果
sed -n ‘/^#/!{/^$/!p}‘ /etc/vsftpd/vsftpd.conf 匹配以 # 開頭的行,進行取反,然後在其結果中對空格開頭的行進行取反,表示過濾空格與註釋
sed -e ‘/^#/d‘ -e ‘/^$/d‘ /etc/vsftpd/vsftpd.conf 刪除匹配的空格行與 # 號開頭的行,sed支持對單個文件進行多條件操作

技術分享圖片

Linux常用命令——sed