Shell脚本文本三剑客之Sed
目錄
一、Sed編輯器
1.sed的介紹
2.Sed工作流程
3.sed工作原理
?
4.sed命令常見(jiàn)用法
5.Sed常用選項(xiàng)
6.sed命令的常用操作
二、Sed命令使用
1.打印內(nèi)容
示例1:打印全部?jī)?nèi)容
示例2:查看文件,打印全部?jī)?nèi)容
示例3:打印指定行內(nèi)容
示例4:根據(jù)地址,打印指定多行內(nèi)容
示例5:打印多行后退出
示例6:打印最后一行,使用通配符$
示例7:支持正則表達(dá)式
示例8:過(guò)濾關(guān)鍵字
示例9:‘#,/關(guān)鍵字/p’ 從第#行開(kāi)始匹配
示例10:‘/關(guān)鍵字/,#’ 找到第#個(gè)關(guān)鍵字為止
示例11:?打印文本的奇數(shù)和偶數(shù)行。
2.刪除內(nèi)容
示例1:刪除指定行
示例2:刪除指定的多行
示例3:?刪除文本中的空行
示例4:?刪除以指定字符結(jié)尾的行及取反。
示例5:先備份內(nèi)容再刪除
3.插入內(nèi)容
示例1:在指定行后插入
示例2:插入空行,修改文件的換行,要多加一個(gè)\
示例3:替換
4.取反
5.搜索替代
示例1:修改selinux開(kāi)機(jī)不自啟配置文件
6.分組調(diào)用
示例1:
示例2:提取IP地址
示例3:@和/效果一樣
一、Sed編輯器
1.sed的介紹
sed編輯器時(shí)一種流編輯器,流編輯器會(huì)在編輯器處理數(shù)據(jù)之前基于預(yù)先提供的一組規(guī)則來(lái)編輯數(shù)據(jù)流。
sed也可以在無(wú)交互的情況下實(shí)現(xiàn)相當(dāng)復(fù)雜的文本處理操作,被廣泛應(yīng)用于shell腳本中,用以完成各種自動(dòng)化處理任務(wù)。
2.Sed工作流程
sed 的工作流程主要包括讀取、執(zhí)行和顯示三個(gè)過(guò)程: 讀取:sed 從輸入流(文件、管道、標(biāo)準(zhǔn)輸入)中讀取一行內(nèi)容并存儲(chǔ)到臨時(shí)的緩沖區(qū)中(又稱模式空間,pattern space)。 執(zhí)行:默認(rèn)情況下,所有的sed 命令都在模式空間中順序地執(zhí)行,除非指定了行的地址,否則sed 命令 將會(huì)在所有的行上依次執(zhí)行。 顯示font>:發(fā)送修改后的內(nèi)容到輸出流。在發(fā)送數(shù)據(jù)后,模式空間將會(huì)被清空。
PS:默認(rèn)情況下所有的sed命令都是在模式空間內(nèi)執(zhí)行的,因此輸入的文件并不會(huì)發(fā)生任何變化,除非是用重定向存儲(chǔ)輸出。
3.sed工作原理
??過(guò)程:
讀入新的一行內(nèi)容到緩存空間;
從指定的操作指令中取出第一條指令,判斷是否匹配pattern;
如果不匹配,則忽略后讀的編輯命令,回到第2步繼續(xù)取出下一條指令;
如果匹配,則針對(duì)緩存的行執(zhí)行后續(xù)的編輯命令;完成后,回到第2步繼續(xù)取出下一條指令;
當(dāng)所有指令都應(yīng)用之后,輸出緩存行的內(nèi)容;回到第1步繼續(xù)讀入下一行內(nèi)容;
當(dāng)所有行都處理完之后,結(jié)束;
4.sed命令常見(jiàn)用法
通常情況下調(diào)用sed命令有兩種格式,如下所示。
其中,"參數(shù)"是指操作的目標(biāo)文件,當(dāng)存在多個(gè)操作對(duì)象時(shí)用,文件之間用逗號(hào)" ,"分隔;而 scriptfile表示腳本文件,需要用"-f"選項(xiàng)指定,當(dāng)腳本文件出現(xiàn)在目標(biāo)文件之前時(shí),表示通過(guò)指定的腳本文件來(lái)處理輸入的目標(biāo)文件。
5.Sed常用選項(xiàng)
-e 或 - -expression=∶ 多點(diǎn)編輯-f 或- -file=∶表示用指定的腳本文件來(lái)處理輸入的文本文件。-h 或- -help∶顯示幫助。-n∶ 不輸出模式空間內(nèi)容到屏幕,即不自動(dòng)打印,加p,又恢復(fù)自動(dòng)打印-i∶ 備份文件文件并原處編輯-r:使用擴(kuò)展正則表達(dá)式6.sed命令的常用操作
"操作"用于指定對(duì)文件操作的動(dòng)作行為,也就是sed的命令。通常情況下是采用的"[n1 [,n2] ]"操作參數(shù)的格式。n1、n2是可選的,代表選擇進(jìn)行操作的行數(shù),如操作需要在5~20行之間進(jìn)行,則表示為"5,20動(dòng)作行為”。
s∶替換,替換指定字符。d∶刪除,刪除選定的行。a∶ 增加,在當(dāng)前行下面增加一行指定內(nèi)容。i∶ 插入,在選定行上面插入一行指定內(nèi)容。c∶ 替換,將選定行替換為指定內(nèi)容。Y∶ 字符轉(zhuǎn)換,轉(zhuǎn)換前后的字符長(zhǎng)度必須相同。p∶ 打印,如果同時(shí)指定行,表示打印指定行;如果不指定行,則表示打印所有內(nèi)容; 如果有非打印字符,則以 AscII碼輸出。其通常與_n"選項(xiàng)一起使用。=∶打印行號(hào)。l(小寫(xiě)L)∶打印數(shù)據(jù)流中的文本和不可打印的ASCII字符(比如結(jié)束符s、制表符\t)二、Sed命令使用
1.打印內(nèi)容
示例1:打印全部?jī)?nèi)容
sed ‘ ’交互模式輸入一行,自動(dòng)打印一行相同的
sed -n ‘ ’ 交互模式輸入一行,關(guān)閉自動(dòng)打印
sed -n ‘ p’加上p又恢復(fù)自動(dòng)打印
[root@yxp opt]#sed ' ' 11 11 22 22 33 33 44 44 [root@yxp opt]#sed -n ' ' 11 22 33 [root@yxp opt]#sed -n ' p' 11 11 22 22 33示例2:查看文件,打印全部?jī)?nèi)容
#法一: [root@yxp opt]#sed ' ' /etc/fstab # # /etc/fstab # Created by anaconda on Sat Sep 4 02:48:23 2021 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=183ca7c7-1989-4f43-9e81-d2676192f5a4 /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 /dev/sdb1 /mnt xfs defaults 0 0#法二 [root@yxp opt]#sed -n ' p' /etc/fstab # # /etc/fstab # Created by anaconda on Sat Sep 4 02:48:23 2021 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=183ca7c7-1989-4f43-9e81-d2676192f5a4 /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 /dev/sdb1 /mnt xfs defaults 0 0示例3:打印指定行內(nèi)容
##例如:打印第四行內(nèi)容 [root@yxp opt]#sed -n ' 4p' /etc/fstab # Created by anaconda on Sat Sep 4 02:48:23 2021[root@yxp opt]#ifconfig ens33|sed -n '2p'inet 192.168.59.102 netmask 255.255.255.0 broadcast 192.168.59.255示例4:根據(jù)地址,打印指定多行內(nèi)容
#打印2-4行 [root@yxp opt]#ifconfig ens33|sed -n '2,4p'inet 192.168.59.102 netmask 255.255.255.0 broadcast 192.168.59.255inet6 fe80::ecee:9f8a:52de:5871 prefixlen 64 scopeid 0x20<link>ether 00:0c:29:3e:22:fe txqueuelen 1000 (Ethernet)#打印2行加4行,就是打印第二行到第6行 [root@yxp opt]#cat -n /etc/passwd|sed -n '2,+4p'2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync示例5:打印多行后退出
[root@yxp opt]#sed '3q' /etc/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示例6:打印最后一行,使用通配符$
[root@yxp opt]#sed -n '$p' /etc/passwd dhcpd:x:177:177:DHCP server:/:/sbin/nologin示例7:支持正則表達(dá)式
#查找基本格式:
sed -n '//,//p' 文件名
第一個(gè)//表示開(kāi)頭位置,第二個(gè)//表示結(jié)尾位置
示例8:過(guò)濾關(guān)鍵字
[root@yxp opt]#sed -n '/root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin示例9:‘#,/關(guān)鍵字/p’ 從第#行開(kāi)始匹配
[root@yxp opt]#sed -n '2,/root/p' /etc/passwd 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 halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin示例10:‘/關(guān)鍵字/,#’ 找到第#個(gè)關(guān)鍵字為止
[root@yxp opt]#sed -n '/root/,3p' /etc/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 operator:x:11:0:operator:/root:/sbin/nologin示例11:?打印文本的奇數(shù)和偶數(shù)行。
[root@yxp opt]#seq 10 |sed -n '1~2p' 1 3 5 7 9 [root@yxp opt]#seq 10 |sed -n '2~2p' 2 4 6 8 10 [root@yxp opt]#seq 10 |sed '1~2d' 2 4 6 8 10 [root@yxp opt]#seq 10 |sed '2~2d' 1 3 5 7 92.刪除內(nèi)容
示例1:刪除指定行
#刪除指定行并不是真正刪除,只是將刪除了的結(jié)果顯示出來(lái),并不是真正刪除了 [root@yxp opt]#cat seq.txt 1 2 3 4 5 6 7 8 9 10 [root@yxp opt]#cat seq.txt |sed '3d' 1 2 4 5 6 7 8 9 10 [root@yxp opt]#cat seq.txt 1 2 3 4 5 6 7 8 9 10示例2:刪除指定的多行
[root@yxp opt]#sed '2,4d' seq.txt 1 5 6 7 8 9 10示例3:?刪除文本中的空行
[root@yxp ~]#sed '/^$/d' /opt/seq.txt 1 2 3 4 5 6 7 8 9 10 [root@yxp ~]#示例4:?刪除以指定字符結(jié)尾的行及取反。
[root@yxp ~]#sed '/nologin$/!d' /etc/passwd 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 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin示例5:先備份內(nèi)容再刪除
[root@yxp opt]#sed -i.bak '3d' seq.txt [root@yxp opt]#cat seq.txt 1 2 4 5 6 7 8 9 10 [root@yxp opt]#cat seq.txt.bak 1 2 3 4 5 6 7 8 9 103.插入內(nèi)容
示例1:在指定行后插入
[root@yxp opt]#cat seq.txt 1 2 4 5 6 7 8 9 10 [root@yxp opt]#sed -i '2a hehe' seq.txt [root@yxp opt]#cat seq.txt 1 2 hehe 4 5 6 7 8 9 10示例2:插入空行,修改文件的換行,要多加一個(gè)\
[root@yxp opt]#cat seq.txt 1 2 hehe 4 5 6 7 8 9 10 [root@yxp opt]#sed -i '2a\\n hehe' seq.txt [root@yxp opt]#cat seq.txt 1 2hehe hehe 4 5 6 7 8 9 10示例3:替換
[root@yxp opt]#sed -i '2chahahaha' seq.txt [root@yxp opt]#cat seq.txt 1 hahahahahehe hehe 4 5 6 7 8 94.取反
[root@yxp opt]#seq 10|sed -n '2!p' 1 3 4 5 6 7 8 9 105.搜索替代
格式:格式:sed 行范圍 s/舊字符串/新字符串/替換標(biāo)記
替換標(biāo)記:
-
數(shù)字:表明新字符串將替換第幾處匹配的地方
-
g : 表明新字符串將會(huì)替換所有匹配的地方
-
p : 打印與替換命令匹配的行,與 -n 一起使用
-
w 文件 :將替換的結(jié)果寫(xiě)到文件中
示例1:修改selinux開(kāi)機(jī)不自啟配置文件
?
[root@yxp opt]#sed -i 's/SELINUX=enabled/SELINUX=disabled/' /etc/selinux/config??
?
示例2:修改多行,使用r 以及-e?
[root@yxp opt]#sed -ri -e 's/SELINUX=disabled/SELINUX=enabled/' /etc/selinux/config ?-e 's/SELINUXTYPE=targeted/SELINUXTYPE=111/' /etc/selinux/config?
示例3:修改全局,后面加g?
[root@yxp opt]#sed -i 's/root/admin/g' passwd
6.分組調(diào)用
示例1:
#分組使用()(),調(diào)用第一段使用\1 [root@yxp opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/' 11 #調(diào)用第2個(gè)分組 [root@yxp opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/' aa #調(diào)用所有分組 [root@yxp opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1\2\3/' 11aaxx示例2:提取IP地址
[root@yxp ~]#ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+) (netmask) ([0-9.]+) (broadcast) ([0-9.]+).*/\2/p' 192.168.72.12示例3:@和/效果一樣
[root@yxp ~]#echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's@^(.*)/([^/]+)@\2@p'
?
總結(jié)
以上是生活随笔為你收集整理的Shell脚本文本三剑客之Sed的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 刘润:四个层次决定企业存亡
- 下一篇: 小旋风蜘蛛池站群X5+五套mip模板