Sed
概述:
sed是一個非交互的文本編輯器,可對文本文件和標(biāo)準(zhǔn)輸入進行編輯牡彻,哄酝,可以編輯一個或者多個文件,簡化對問價你的反復(fù)操作瘟裸,編寫轉(zhuǎn)換程序等
原理:
在處理文本時把當(dāng)前處理的行存儲在臨時緩沖區(qū)中,成為“模式空間”然后用sed命令處理緩沖區(qū)的內(nèi)容诵竭,
處理完成后吧緩沖的內(nèi)容輸出到屏幕或者寫入文件
格式:
sed 【參數(shù)】 【命令】 文件名
注意:sed 工具處理文本话告,文本內(nèi)容輸出屏幕已經(jīng)修改,但是文件內(nèi)容其實并沒有修改卵慰,需要加-i參數(shù)對文件徹底修改
sed 常用參數(shù)
-i : 讓處理生效
-n:只顯示匹配到的行
-e:擴展參數(shù)(兩個多個命令都執(zhí)行沙郭,每一個之間用-e隔開)
sed常用命令
s:字符串查找(常用作替換)
d:刪除
p:打印
i:在匹配的行之前添加
a:在匹配的行之后添加
N:合并模式(sed 'N;命令')可實現(xiàn)多行換成一行
例:用sed修改1.txt中的1 替換成2地址:
sed -i "s/1/2/g" 1.txt
s 表示替換,后面的第一個/ 表示查找后面的字符 第二個/ 表示替換成 后面那個字符 第三個/ 代表結(jié)束裳朋,g 是全局替換 -i 是把模式空間的修改寫入到文件(讓修改生效) 單引號里不支持變量病线,所以盡量用雙引號
例2:一條命令把daemon替換成qq ,adm 替換成baidu
[root@server-1 sed]# cat passwd
root:x:0:0:root:/root:/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
兩種方法:(1-5行就是1,5s/)
sed "s/daemon/qq/g;s/adm/baidu/g" passwd
sed -e "s/daemon/qq/g" -e "s/adm/baidu/g" passwd
例3:從第一行匹配到adm這行 ,并打印
sed -n "1,/adm/p" passwd
例4:在adm這行后面加*************(a命令是在匹配項后加***送挑;i命令是在匹配項前加)
sed "/adm/a********" passwd
[root@server-1 sed]# sed "/adm/a********" passwd
root:x:0:0:root:/root:/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
例5:分別刪除最后一行和2,3行(d是刪除夜矗,要搭配單引號使用)
sed '$d' passwd
sed '2,3d' passwd
例6:number文件中的數(shù)字如何找出最大數(shù)和最小數(shù) 分別打印下來(sort -r 從大到小排列,-n 默認(rèn)從小到打排列)
[root@server-1 sed]# cat number.txt
1 2323
1212 1111111
232323 563937937434
343083 9 4 8394838493843
230283 0293 3032 930923 2039 20932903
[root@server-1 sed]# sed 's/ /\n/g' number.txt|sort -nr|sed -n '1p;$p'
8394838493843
1
例7:打印nginx主配置文件中,有效內(nèi)容并顯示行號(不顯示注釋和空白行)
用grep 實現(xiàn)(取反-v)
grep -v "#" /etc/nginx/nginx.conf|grep -nv "^$"
用sed實現(xiàn)(d 刪除)
sed "/#/d;/^$/d" /etc/nginx/nginx.conf
例8:在root開頭的行加1. (先找到/root/在s替換让虐,在它的開頭^,替換成1.&罢荡,全局其中&代表開頭的root)這是只替換root開頭的行 而不是所有root關(guān)鍵字都換
[root@server-1 sed]# sed "/root/s/^/1.&/g" passwd
1.root:x:0:0:root:/root:/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
例9:打印第一行和最后一行
sed -n '1p;$p' old.txt
例10:查找w字母為結(jié)尾的赡突,并在其行尾加word(&表示添加)
[root@server-1 sed]# sed 's/w$/&word/g' old.txt
newword
2
3
4
10
還可以用
sed '/w$/s/$/&word/g' old.txt 查找w結(jié)尾的行、替換区赵,$結(jié)尾表示惭缰,添加word(&表示添加)
例11:查找sellinux策略enforcing為disabled,查找selinux行笼才,將其行enforcing改成disabled漱受,!s表示不包括selinux行
sed -i "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config
sed -i "/SELINUX/骡送!s/enforcing/disabled/g" /etc/selinux/config
例12:passwd文件中每行后丟加入一行空行昂羡;兩行空行 ;前三行后插入空行(G是高級用法摔踱,G表示插入空行)
sed '/^$/d;G' passwd
sed '/^$/d;G;G' passwd
sed '/^$/d;1,3G' passwd
例13:將passwd文件 偶數(shù)行刪除虐先; 隔兩行刪除一行
sed 'n; d' passwd
sed 'n;n; d' passwd
例14:刪除passwd文件行前和行尾的任意空格([\t]代表空格)
sed 's/^[\t]*//; s/^[\t]$//' passwd
例15:打印old和new之間的內(nèi)容
sed "/old/,/new/"p passwd
例16,打印nginx訪問日志2020年7月20日9點 到 10點的訪問量
sed -n "/2020:9:00/,/2020:10:00/"p access_20200720.log|wc -l