文本處理sed
一:簡介
? Stream EDitor, 行編輯器
首先對于一個(gè)文本文件來說,它是由至上而下的一行或N行組成。
1、當(dāng)用sed命令對文本進(jìn)行處理的時(shí)候,sed先讀取對象的文本文件的第一行到模式空間中。
2、當(dāng)有內(nèi)容進(jìn)入“模式空間”時(shí),sed的編輯命令對模式空間中的內(nèi)容進(jìn)行編輯操作(修改,替換,刪除,追加,顯示等等)
3、模式空間中的內(nèi)容編輯處理完成之后,sed把此內(nèi)容通過標(biāo)準(zhǔn)輸出(默認(rèn)為顯示器)打印出來,并刪除模式空間中的內(nèi)容。
4、第一行處理結(jié)束。從新讀取第二行的內(nèi)容進(jìn)行處理,直到最后一行。
二:語法
? 用法:
sed [option]... 'script' inputfile...
? 常用選項(xiàng):
-n:不輸出模式空間內(nèi)容到屏幕,即不自動(dòng)打印
-e: 多點(diǎn)編輯
eg: sed -e 's/dog/cat/' -e 's/hi/lo/' pets
-f:/ PATH/SCRIPT_FILE : 從指定文件中讀取編輯腳本
-r: 支持使用擴(kuò)展正則表達(dá)式
-i.bak: 備份文件并原處編輯(.bak是后綴名)
eg : sed -i.bak '1-2d' f1
將f1文件備份生成f1.bak文件,再進(jìn)行修改
? script: ’ 地址(要處理的行)+命令’
地址定界:
(1) 不給地址:對全文進(jìn)行處理
(2) 單地址:
#: 指定的行
/pattern/ :被此處模式所能夠匹配到的每一行
eg: sed -n /^r/ /etc/passwd
(3) 地址范圍:
#,#
#,+#
eg: sed -n '3,+6p' /etc/passwd(取第三行,到往下的六行)
/pat1/,/pat2/
eg: sed -n '/^h/,/^s/p' /etc/passwd
#,/pat1/
eg: sed -n '2p,/^s/' /etc/passwd
(4) ~ :步進(jìn)
1~2 奇數(shù)行(從第一行開始,每次加2)
2~2 偶數(shù)行(從第二行開始,每次加2)
eg: sed 100|sed '2~2p'
編輯命令:
d: 刪除模式空間匹配的行
eg:sed '90d' f1 刪除第90行
p: 顯示模式空間中的內(nèi)容
eg:sed '90p' f1 打印第90行
a [\]text :在指定行 后面 追加文本
支持 使用\n (表示換行) 實(shí)現(xiàn)多行追加
eg:sed '90anewline' f1
sed '90a\new\nnewline\nnewline' f1
i [\]text :在行前面 插入文本
c [\]text :替換行為單行或多行文本
eg: sed '10,90c\ new line1\nnew line2\nnewline3' f1
把十到九十行都刪了用后面的內(nèi)容代替
w /path/somefile: 保存模式匹配的行至指定文件
eg:sed '10,90w /root/f2' f1
把f2的10到90行保存到f1
r /path/somefile :讀取指定文件的文本至模式空間中匹配到的行后
eg: sed '10r /etc/issue' f1
將/etc/issue讀入到f1的第10行后
=: 為模式空間中的行打印行號
eg: sed '=' /etc/passwd
!: 模式空間中匹配行取反處理
eg:sed -n '1~2!p' 取出偶數(shù)行
s/// :查找替換, 支持使用其它分隔符,s@@@
? 替換標(biāo)記:
g: 行內(nèi)全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE :將替換成功的行
eg:sed '2~2s/root/ROOT/g' f1 將偶數(shù)行的root替換成ROOT
高級編輯命令:
h: 把模式空間中的內(nèi)容覆蓋至保持空間中
H :把模式空間中的內(nèi)容追加至保持空間中
g: 從保持空間取出數(shù)據(jù)覆蓋至模式空間
G :從保持空間取出內(nèi)容追加至模式空間
x: 把模式空間中的內(nèi)容與保持空間中的內(nèi)容進(jìn)行互換
n: 讀取匹配到的行的下一行 覆蓋 至模式空間
N :讀取匹配到的行的下一行 追加 至模式空間
d: 刪除模式空間中的行
D :刪除 當(dāng)前模式空間開端至\n (換行)的內(nèi)容( 不再傳 至標(biāo)準(zhǔn)輸出),放棄之后的命令,
但是對剩余模式空間重新執(zhí)行sed
三:sed練習(xí)
1 、刪除centos7 系統(tǒng)/etc/grub2.cfg 文件中所有以空白開頭的行行首的空白字符
sed 's/^[[:space:]]\+//' /etc/grub2.cfg
2 、刪除/etc/fstab 文件中所有以# 開頭,后面至少跟一個(gè)空白字符的行的行首的# 和空白字符
sed 's/^#[[:space:]]\+//' /etc/fstab
3 、在centos6 系統(tǒng)/root/install.log 每一行行首增加#號
sed 's/^/#/g' /root/install.log
4 、在/etc/fstab 文件中不以# 開頭的行的行首增加#號
sed 's/^[^#]/#/g' /etc/fstab
5 、處理/etc/fstab 路徑, 使用sed 命令取出其目錄名和基名
取目錄名echo "/etc/sysconfig/network"|sed -r 's@(^/.*/)([^/]+/?)@\1@'
取基名:echo "/etc/sysconfig/network"|sed -r 's@(^/.*/)([^/]+/?)@\2@'
6 、利用sed 取出ifconfig 命令中本機(jī)的IPv4 地址
ifconfig eth0|sed -n '2p' |sed -e 's/^.*r://' -e 's/ .*//'
7 、統(tǒng)計(jì)centos 安裝光盤中Package 目錄下的所有rpm 文件的以. 分隔倒數(shù)第二個(gè)字段的重復(fù)次數(shù)
法一: ll /misc/cd/Packages/ |egrep '*.rpm' | sed -r 's@(^.*\.)
( [^.]+ )\.rpm$@\2@' | sort | uniq -c
法二: ls /misc/cd/Packages/ |egrep '*.rpm$'|sed -e 's@.rpm@@' -e 's@.*\.@@'
| sort |uniq -c
8 、統(tǒng)計(jì)/etc/init.d/functions 文件中每個(gè)單詞的出現(xiàn)次數(shù),并排序(用grep 和sed 兩種方法分別實(shí)現(xiàn))
sed -nre 's@[^[:alpha:]]+@\n@gp' /etc/init.d/functions |sort|uniq -c|sort -n
grep -oE '\<[[:alpha:]_]+[[:alnum:]]+\>' /etc/init.d/functions
9 、將文本文件的n 和n+1 行合并為一行,n為奇數(shù)行
sed -n 'N;s/\n//p' /etc/passwd