Linux常用命令——sed
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