文本處理sed
一:簡介
? Stream EDitor, 行編輯器
首先對于一個文本文件來說朴上,它是由至上而下的一行或N行組成拷沸。
1、當用sed命令對文本進行處理的時候恨胚,sed先讀取對象的文本文件的第一行到模式空間中脚翘。
2灼卢、當有內容進入“模式空間”時,sed的編輯命令對模式空間中的內容進行編輯操作(修改来农,替換鞋真,刪除,追加沃于,顯示等等)
3涩咖、模式空間中的內容編輯處理完成之后,sed把此內容通過標準輸出(默認為顯示器)打印出來繁莹,并刪除模式空間中的內容檩互。
4、第一行處理結束咨演。從新讀取第二行的內容進行處理闸昨,直到最后一行。
二:語法
? 用法:
sed [option]... 'script' inputfile...
? 常用選項:
-n:不輸出模式空間內容到屏幕,即不自動打印
-e: 多點編輯
eg: sed -e 's/dog/cat/' -e 's/hi/lo/' pets
-f:/ PATH/SCRIPT_FILE : 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i.bak: 備份文件并原處編輯(.bak是后綴名)
eg : sed -i.bak '1-2d' f1
將f1文件備份生成f1.bak文件饵较,再進行修改
? script: ’ 地址(要處理的行)+命令’
地址定界:
(1) 不給地址:對全文進行處理
(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) ~ :步進
1~2 奇數行(從第一行開始,每次加2)
2~2 偶數行(從第二行開始循诉,每次加2)
eg: sed 100|sed '2~2p'
編輯命令:
d: 刪除模式空間匹配的行
eg:sed '90d' f1 刪除第90行
p: 顯示模式空間中的內容
eg:sed '90p' f1 打印第90行
a [\]text :在指定行 后面 追加文本
支持 使用\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
把十到九十行都刪了用后面的內容代替
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' 取出偶數行
s/// :查找替換, 支持使用其它分隔符横辆,s@@@
? 替換標記:
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE :將替換成功的行
eg:sed '2~2s/root/ROOT/g' f1 將偶數行的root替換成ROOT
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H :把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G :從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行 覆蓋 至模式空間
N :讀取匹配到的行的下一行 追加 至模式空間
d: 刪除模式空間中的行
D :刪除 當前模式空間開端至\n (換行)的內容( 不再傳 至標準輸出),放棄之后的命令茄猫,
但是對剩余模式空間重新執(zhí)行sed
三:sed練習
1 狈蚤、刪除centos7 系統(tǒng)/etc/grub2.cfg 文件中所有以空白開頭的行行首的空白字符
sed 's/^[[:space:]]\+//' /etc/grub2.cfg
2 、刪除/etc/fstab 文件中所有以# 開頭划纽,后面至少跟一個空白字符的行的行首的# 和空白字符
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 命令中本機的IPv4 地址
ifconfig eth0|sed -n '2p' |sed -e 's/^.*r://' -e 's/ .*//'
7 蹋绽、統(tǒng)計centos 安裝光盤中Package 目錄下的所有rpm 文件的以. 分隔倒數第二個字段的重復次數
法一: 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)計/etc/init.d/functions 文件中每個單詞的出現次數,并排序(用grep 和sed 兩種方法分別實現)
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為奇數行
sed -n 'N;s/\n//p' /etc/passwd