我為什么要詳細記錄sed命令:
sed 擅長取行。工作中三劍客使用頻率最高,本篇文章將對sed命令常用的 增,刪,改,查
進行詳細講解,以備以后工作中遺忘了查詢,sed命令是作為運維人員來說,必須必掌握的技能
如果三劍客你不會,那么你不用做運維了。
sed簡介:
是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理
時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed命令處理緩
沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接着處理下一行,這樣不斷重復,直到文件末尾。
文件內容並沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件
的反復操作;編寫轉換程序等。
添加測試文本:
cat >sed.log<<"EOF"
101,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO
>>"EOF"
|
sed的語法格式:
sed [選項] [指令] [輸入文件]
sed命令的執行流程:
sed命令是把文件一行行的讀到內存中當成一行處理, 它也被稱為流編輯器,跟車間中的流水線一樣,一行一行的逐個處理。獲取到需要的內容后顯示到屏幕上。

sed原理:
sed 讀取一行內容后,sed判斷是否滿足條件
sed版本查看:
sed -v |
sed基礎參數:
-n 取消默認輸出
-r 支持正則表達式
-p 打印
-e 多項編輯
-i.bak
修改后備份
s 搜索一次
sg 搜索全局
# # # : s#替換前#替換后#g
/ / / : 與###一樣
|
sed功能詳解:
sed增加:
-i : 在 XX行的下一行增加內容
-a: 在XX行的上一行增加內容
sed i參數 :演示
增:
案例1:sed單行增加
[root@chenleilei ~]# sed '2i nihaoya' sed.log 101,$oldboy,CEO nihaoya 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
案例2:sed行前多行增加
[root@chenleilei ~]# sed '2i nihaoya\nwohenhao' sed.log 101,$oldboy,CEO nihaoya wohenhao 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
-a:演示
【增】案例1:sed行后單行增加
[root@chenleilei ~]# sed '2a nihaoya' sed.log 101,$oldboy,CEO 102,$zhangyao,CTO nihaoya 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
【增】案例2:sed行后多行增加
[root@chenleilei ~]# sed '2a nihaoya\nwohenhao' sed.log
101,$oldboy,CEO
102,$zhangyao,CTO
nihaoya
wohenhao
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO
|
【增】案例3:sed 不同行多項增加 sed -e
[root@chenleilei ~]# sed -e '2i 123' -e '5i 456' sed.log 101,$oldboy,CEO 123 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 456 105,$feixue,CIO |
sed刪除 (d)
【刪】sed刪除案例1: 刪除指定行
[root@chenleilei ~]# sed '4d' sed.log 101,$oldboy,CEO 102,$zhangyao,CTO 103,$Alex,COO 105,$feixue,CIO |
【刪】sed刪除案例2:刪除連續的行
[root@chenleilei ~]# sed '2,4d' sed.log 101,$oldboy,CEO 105,$feixue,CIO |
【刪】sed刪除案例3:刪除不連續的行
seq 10 |sed -e{2,4,8}d ##注意這里不能添加引號或者雙引號,否則報錯 |
【刪】sed 刪除案例4: 刪除 n和n 匹配的行
[root@chenleilei ~]# sed -nr '/103|105/!p' sed.log
101,$oldboy,CEO 102,$zhangyao,CTO 104,$yy,CFO ### !除了103.105開頭的行 都刪除 然后打印 |
【改.替換】sed修改案例1:
修改:
案例1:修改單個字符
[root@chenleilei ~]# sed 's#102#1031#g' sed.log 101,$oldboy,CEO 1031,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
案例2: 修改101為109
[root@chenleilei ~]# sed -r '1s#[0-9]+#109#' sed.log 109,$oldboy,CEO 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
案例3: 把101改為oldboy ----報錯原因:sed -r 一個一個讀取,讀取到有數字就改為
oldboy,這里有3個數字,所以出現了3個oldboy
[root@chenleilei ~]# sed '1s#[0-9]#oldboy#g' sed.log oldboyoldboyoldboy,$oldboy,CEO 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO 解決辦法(-r): [root@chenleilei ~]# sed -r '1s#[0-9]+#oldboy#g' sed.log oldboy,$oldboy,CEO 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO 如果配錯了那么3個oldboy 如何改回101呢? [root@chenleilei ~]# sed -r '1s#(oldboy)+#101#' sed.log 101,$oldboy,CEO 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO 如果你寫成了 sed -r '1s#(oldboy)+#101#g' sed.log 也會不成功,那是因為 他有g選項,會全部替換,也就是3個oldboy。解決辦法 把 oldboy 使用括號括起來,然后使用 s 尾部的g不要使用,g就是變成3個oldboy的源泉 |
sed -ri 修改后備份,但是,i 必須要放在最后,否則無法備份
例子: sed -ri '/^123/d' 1.txt
sed -i 的工作原理:
sed -i.bak修改文件的時候,他會把源文件移動,然后創建新的文件,寫入這個命令的結果。
可以通過修改文件后使用 ls -il x x.bak 來查看 x文件 和他的備份文件 x.bak 。你會發現他們的inode就不一樣了。這就是sed -i.bak 的原理
小問題:
echo用來給文件追加多行內容的時候,需要使用 echo -e
【查詢】 | 是正則符號需要加r
[顯示] 1到4行
[root@chenleilei ~]# sed -n '1,4p' sed.log
101,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
|
【查詢】 | 是正則符號需要加r
排除1-4行
[root@chenleilei ~]# sed -n '1,4!p' sed.log 105,$feixue,CIO |
[查詢]顯示2 4 兩行
[root@chenleilei ~]# sed -nr '/2|4/p' sed.log 102,$zhangyao,CTO 104,$yy,CFO |
[查詢] 查詢103開頭的行
[root@chenleilei ~]# sed -n '/^103/p' sed.log 103,$Alex,COO |
[查詢] 查詢103結尾的行
[root@chenleilei ~]# sed -n '/$103/p' sed.log 103,$Alex,COO,103 |
[查詢] 查詢103開頭
到105開頭的行(正則)
[root@chenleilei ~]# sed -n '/^103/,/^105/p' sed.log 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
[查詢] 查詢 105以及 和 103 開頭的行(正則 需要加 r)
[root@chenleilei ~]# sed -nr '/^103|^105/p' sed.log 103,$Alex,COO 105,$feixue,CIO |
[排除] 排除一行
[root@chenleilei ~]# sed -n '1!p' sed.log 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
[排除] 排除多行
[root@chenleilei ~]# sed -n '1,2!p' sed.log 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
[排除不連續的行]
[root@chenleilei ~]# sed -nr '/102|104/!p' sed.log 101,$oldboy,CEO 103,$Alex,COO 105,$feixue,CIO |