linux文本處理三劍客之sed
上一節我們已經學習過了grep,今天來學習sed。它是按照script的指令,來處理,編輯一個或多個文本文件,簡化對文件的反復操作,編寫轉換程序等。
sed用法
sed 選項 動作 輸入文件
參數說明:
-n 不輸出到屏幕,不打印(默認打印)
-e 多點編輯輸入的文本文件
-f 以選項中指定的script文件來處理輸入的文本文件
-r 擴展正則表達式
-h 顯示幫助
-v 顯示版本信息
-i sed 的『 -i 』選項可以直接修改文件內容,這功能非常有幫助!舉例來說,如果你有一個 100 萬行的文件,你要在第 100 行加某些文字,此時使用 vim 可能會瘋掉!因為文件太大了!那怎辦?就利用 sed 啊!透過 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修訂!
實例:
-n :
[root@localhost ~]# seq 1 10 |sed -n ‘8p‘ 8 [root@localhost ~]# seq 1 10 |sed -n "$[$(seq 1 10|wc -l)-1]p" 9 #輸出倒數第二行
-e:
[root@localhost ~]#sed -e 2a\desk e how are you? apple banana apple desk wine tea juice desk chair
-r:
[root@localhost app]# cat /etc/passwd |sed -r ‘s/(r..t).*\1/hello/g‘ hello:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
動作說明:
a 新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c 取代 把指定行內容替換
d 刪除 把指定行刪除
i 插入 i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p 打印 亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
s 取代 可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!
= 打印行號
nl 顯行號
1.以行為單位的新增/刪除
將 /etc/passwd 的內容復制到/app目錄下,列出並且列印行號。
-a 在第二行後(亦即是加在第三行)加上drink tea字樣!
[root@localhost app]# nl /etc/passwd | sed ‘2a drink tea‘ 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin drink tea 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-i 那如果是要在第二行前
[root@localhost app]# nl /etc/passwd | sed ‘2i drink tea‘ 1 root:x:0:0:root:/root:/bin/bash drink tea 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
-d 第 2~5 行刪除!
[root@localhost app]# nl /etc/passwd |sed ‘2,5d‘ 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin
sed 的動作為 ‘2,5d‘ ,那個 d 就是刪除!因為 2-5 行給他刪除了,所以顯示的數據就沒有 2-5 行羅~ 另外,註意一下,原本應該是要下達 sed -e 才對,沒有 -e 也行啦!同時也要註意的是, sed 後面接的動作,請務必以 ‘‘ 兩個單引號括住喔
2.以行為單位的替換與顯示
-c 將第2-5行的內容取代成為『No 2-5 number』呢?
[root@localhost app]# nl /etc/passwd | sed ‘2,5c No 2-5 number‘ 1 root:x:0:0:root:/root:/bin/bash No 2-5 number 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
3.數據的搜尋並顯示
搜索 /etc/passwd有root關鍵字的行
[root@localhost app]# nl /etc/passwd | sed -n ‘/root/p‘ 1 root:x:0:0:root:/root:/bin/bash 10 operator:x:11:0:operator:/root:/sbin/nologin
4.數據的搜尋並替換
除了整行的處理模式之外, sed 還可以用行為單位進行部分數據的搜尋並取代。基本上 sed 的搜尋與替代的與 vi 相當的類似!他有點像這樣:
sed ‘s/要被取代的字串/新的字串/g‘
[root@localhost app]# ifconfig ens33|sed -n ‘2p‘|sed ‘s/^.*inet//g‘|sed ‘s/net.*$//g‘ 172.18.254.169
5.多點編輯
一條sed命令,刪除/etc/passwd第三行到末尾的數據,並把bash替換為blueshell。-e表示多點編輯,第一個編輯命令刪除/etc/passwd第三行到末尾的數據,第二條命令搜索bash替換為blueshell
[root@localhost app]# nl /etc/passwd | sed -e ‘3,$d‘ -e ‘s/bash/blueshell/‘ 1 root:x:0:0:root:/root:/bin/blueshell 2 bin:x:1:1:bin:/bin:/sbin/nologin
6.地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 指定的行,$:最後一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址範圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行
高級用法:
h 模式空間覆蓋至保持空間
H 模式空間追加至保持空間
g 保持空間覆蓋至模式空間
G 保持空間追加至模式空間
x 保持空間和模式空間內容互換
n 行的下一行覆蓋至模式空間
N 行的下一行追加至模式空間
D 保留最後一行
d 刪除模式空間行
例子:
(1)輸出偶數行
[root@localhost ~]# seq 1 8 |sed -n ‘n;p‘ 2 4 6 8
(2)只顯示奇數行
[root@localhost ~]# seq 1 10 |sed ‘n;d‘ 1 3 5 7 9
(3)倒序輸出
[root@localhost ~]# seq 1 10 |sed -n ‘1!G;h;$p‘ 10 9 8 7 6 5 4 3 2 1
(4)輸出倒數後兩行
[root@localhost ~]# seq 1 10 |sed ‘$!N;$!D‘ 9 10
(5)空行刪除,每行後加一個空行,即保證每行後只有一個空行
[root@localhost ~]# cat seq.txt |sed ‘/^$/d;G‘ 1 2 3 4 5 6
linux文本處理三劍客之sed