Shell脚本文本三剑客之Sed
目錄
一、Sed編輯器
1.sed的介紹
2.Sed工作流程
3.sed工作原理
?
4.sed命令常見用法
5.Sed常用選項
6.sed命令的常用操作
二、Sed命令使用
1.打印內容
示例1:打印全部內容
示例2:查看文件,打印全部內容
示例3:打印指定行內容
示例4:根據地址,打印指定多行內容
示例5:打印多行后退出
示例6:打印最后一行,使用通配符$
示例7:支持正則表達式
示例8:過濾關鍵字
示例9:‘#,/關鍵字/p’ 從第#行開始匹配
示例10:‘/關鍵字/,#’ 找到第#個關鍵字為止
示例11:?打印文本的奇數和偶數行。
2.刪除內容
示例1:刪除指定行
示例2:刪除指定的多行
示例3:?刪除文本中的空行
示例4:?刪除以指定字符結尾的行及取反。
示例5:先備份內容再刪除
3.插入內容
示例1:在指定行后插入
示例2:插入空行,修改文件的換行,要多加一個\
示例3:替換
4.取反
5.搜索替代
示例1:修改selinux開機不自啟配置文件
6.分組調用
示例1:
示例2:提取IP地址
示例3:@和/效果一樣
一、Sed編輯器
1.sed的介紹
sed編輯器時一種流編輯器,流編輯器會在編輯器處理數據之前基于預先提供的一組規則來編輯數據流。
sed也可以在無交互的情況下實現相當復雜的文本處理操作,被廣泛應用于shell腳本中,用以完成各種自動化處理任務。
2.Sed工作流程
sed 的工作流程主要包括讀取、執行和顯示三個過程: 讀取:sed 從輸入流(文件、管道、標準輸入)中讀取一行內容并存儲到臨時的緩沖區中(又稱模式空間,pattern space)。 執行:默認情況下,所有的sed 命令都在模式空間中順序地執行,除非指定了行的地址,否則sed 命令 將會在所有的行上依次執行。 顯示font>:發送修改后的內容到輸出流。在發送數據后,模式空間將會被清空。
PS:默認情況下所有的sed命令都是在模式空間內執行的,因此輸入的文件并不會發生任何變化,除非是用重定向存儲輸出。
3.sed工作原理
??過程:
讀入新的一行內容到緩存空間;
從指定的操作指令中取出第一條指令,判斷是否匹配pattern;
如果不匹配,則忽略后讀的編輯命令,回到第2步繼續取出下一條指令;
如果匹配,則針對緩存的行執行后續的編輯命令;完成后,回到第2步繼續取出下一條指令;
當所有指令都應用之后,輸出緩存行的內容;回到第1步繼續讀入下一行內容;
當所有行都處理完之后,結束;
4.sed命令常見用法
通常情況下調用sed命令有兩種格式,如下所示。
其中,"參數"是指操作的目標文件,當存在多個操作對象時用,文件之間用逗號" ,"分隔;而 scriptfile表示腳本文件,需要用"-f"選項指定,當腳本文件出現在目標文件之前時,表示通過指定的腳本文件來處理輸入的目標文件。
5.Sed常用選項
-e 或 - -expression=∶ 多點編輯-f 或- -file=∶表示用指定的腳本文件來處理輸入的文本文件。-h 或- -help∶顯示幫助。-n∶ 不輸出模式空間內容到屏幕,即不自動打印,加p,又恢復自動打印-i∶ 備份文件文件并原處編輯-r:使用擴展正則表達式6.sed命令的常用操作
"操作"用于指定對文件操作的動作行為,也就是sed的命令。通常情況下是采用的"[n1 [,n2] ]"操作參數的格式。n1、n2是可選的,代表選擇進行操作的行數,如操作需要在5~20行之間進行,則表示為"5,20動作行為”。
s∶替換,替換指定字符。d∶刪除,刪除選定的行。a∶ 增加,在當前行下面增加一行指定內容。i∶ 插入,在選定行上面插入一行指定內容。c∶ 替換,將選定行替換為指定內容。Y∶ 字符轉換,轉換前后的字符長度必須相同。p∶ 打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容; 如果有非打印字符,則以 AscII碼輸出。其通常與_n"選項一起使用。=∶打印行號。l(小寫L)∶打印數據流中的文本和不可打印的ASCII字符(比如結束符s、制表符\t)二、Sed命令使用
1.打印內容
示例1:打印全部內容
sed ‘ ’交互模式輸入一行,自動打印一行相同的
sed -n ‘ ’ 交互模式輸入一行,關閉自動打印
sed -n ‘ p’加上p又恢復自動打印
[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:查看文件,打印全部內容
#法一: [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:打印指定行內容
##例如:打印第四行內容 [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:根據地址,打印指定多行內容
#打印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:支持正則表達式
#查找基本格式:
sed -n '//,//p' 文件名
第一個//表示開頭位置,第二個//表示結尾位置
示例8:過濾關鍵字
[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:‘#,/關鍵字/p’ 從第#行開始匹配
[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:‘/關鍵字/,#’ 找到第#個關鍵字為止
[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:?打印文本的奇數和偶數行。
[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.刪除內容
示例1:刪除指定行
#刪除指定行并不是真正刪除,只是將刪除了的結果顯示出來,并不是真正刪除了 [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:?刪除以指定字符結尾的行及取反。
[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:先備份內容再刪除
[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.插入內容
示例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:插入空行,修改文件的換行,要多加一個\
[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/舊字符串/新字符串/替換標記
替換標記:
-
數字:表明新字符串將替換第幾處匹配的地方
-
g : 表明新字符串將會替換所有匹配的地方
-
p : 打印與替換命令匹配的行,與 -n 一起使用
-
w 文件 :將替換的結果寫到文件中
示例1:修改selinux開機不自啟配置文件
?
[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.分組調用
示例1:
#分組使用()(),調用第一段使用\1 [root@yxp opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/' 11 #調用第2個分組 [root@yxp opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/' aa #調用所有分組 [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'
?
總結
以上是生活随笔為你收集整理的Shell脚本文本三剑客之Sed的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刘润:四个层次决定企业存亡
- 下一篇: 小旋风蜘蛛池站群X5+五套mip模板