Shell脚本工具三剑客 Sed
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 一、sed工具的概述
- 二、sed工作流程
- 三、sed的命令格式
- 1.常用選項
- 2.常用操作
- 四、sed命令的使用
- 1.打印內(nèi)容
- 2.刪除內(nèi)容
- 3.插入內(nèi)容
- 4.取反
- 5.搜索替代
- 6.分組調(diào)用
一、sed工具的概述
sed是一種流編輯器流編輯器會在編輯器處理數(shù)據(jù)之前基于預先提供的一組規(guī)則來編輯數(shù)據(jù)流
sed編輯器可以根據(jù)命令來處理數(shù)據(jù)流中的數(shù)據(jù) 這些命令要么從命令行中輸入要么存儲在一個
命令文本文件中
二、sed工作流程
sed的工作流程主要就是讀取 執(zhí)行 顯示 三種
讀取:sed從輸入流(文件、管道、標準輸入)中讀取一行內(nèi)容并存儲到臨時的緩沖區(qū)中(又稱模式空間,pattern space )。
執(zhí)行:默認情況下,所有的sed 命令都在模式空間中順序地執(zhí)行, 除非指定了行的地址,否則sed命令將會在所有的行上依次執(zhí)行
顯示:發(fā)送修改后的內(nèi)容到輸出流(屏幕)。在發(fā)送數(shù)據(jù)后,模式空間將會被清空。在所有的文件內(nèi)容都被處理完成之前,上.述過程將重復執(zhí)行,直至所有內(nèi)容被處理完。
三、sed的命令格式
1.常用選項
-h 或- -help∶顯示幫助。
-r:使用擴展正則表達式
-i∶ 備份文件文件并原處編輯
-e 或 - -expression=∶ 多點編輯
-f 或- -file=∶表示用指定的腳本文件來處理輸入的文本文件。
-n∶ 不輸出模式空間內(nèi)容到屏幕,即不自動打印,加p,又恢復自動打印
2.常用操作
s∶替換,替換指定字符。
d∶刪除,刪除選定的行。
c∶ 替換,將選定行替換為指定內(nèi)容。
a∶ 增加,在當前行下面增加一行指定內(nèi)容。
i∶ 插入,在選定行上面插入一行指定內(nèi)容。
Y∶ 字符轉換,轉換前后的字符長度必須相同。
p∶ 打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內(nèi)容; 如果有非打印字符,則以 AscII碼輸出。其通常與_n"選項一起使用。
=∶打印行號。
l(小寫L)∶打印數(shù)據(jù)流中的文本和不可打印的ASCII字符(比如結束符s、制表符\t)
四、sed命令的使用
1.打印內(nèi)容
打印全部內(nèi)容
sed ‘ ’交互模式輸入一行,自動打印一行相同的
sed -n ‘ ’ 交互模式輸入一行,關閉自動打印
sed -n ‘ p’加上p又恢復自動打印
查看文件,打印全部內(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打印指定行內(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根據(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打印多行后退出
[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打印最后一行,使用通配符$
[root@yxp opt]#sed -n '$p' /etc/passwd dhcpd:x:177:177:DHCP server:/:/sbin/nologin支持正則表達式
#查找基本格式: sed -n '//,//p' 文件名 第一個//表示開頭位置,第二個//表示結尾位置[root@yxp opt]#sed -n '/^r/,/^f/p' /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 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 games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin setroubleshoot:x:995:993::/var/lib/setroubleshoot:/sbin/nologin rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin qemu:x:107:107:qemu user:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin chrony:x:994:990::/var/lib/chrony:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin geoclue:x:993:988:User for geoclue:/var/lib/geoclue:/sbin/nologin sssd:x:992:987:User for sssd:/:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin yxp:x:1000:1000:yxp:/home/yxp:/bin/bash dhcpd:x:177:177:DHCP server:/:/sbin/nologin過濾關鍵字
[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‘#,/關鍵字/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‘/關鍵字/,#’ 找到第#個關鍵字為止
[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打印文本的奇數(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)容
刪除指定行
#刪除指定行并不是真正刪除,只是將刪除了的結果顯示出來,并不是真正刪除了 [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刪除指定的多行
[root@yxp opt]#sed '2,4d' seq.txt 1 5 6 7 8 9 10刪除文本中的空行
[root@yxp ~]#sed '/^$/d' /opt/seq.txt 1 2 3 4 5 6 7 8 9 10 [root@yxp ~]#刪除以指定字符結尾的行及取反
[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先備份內(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)容
在指定行后插入
[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插入空行,修改文件的換行,要多加一個\
[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替換
[root@yxp opt]#sed -i '2chahahaha' seq.txt [root@yxp opt]#cat seq.txt 1 hahahahahehe hehe 4 5 6 7 8 9 104.取反
[root@yxp opt]#seq 10|sed -n '2!p' 1 3 4 5 6 7 8 9 105.搜索替代
格式:格式:sed 行范圍 s/舊字符串/新字符串/替換標記替換標記:
數(shù)字:表明新字符串將替換第幾處匹配的地方
g : 表明新字符串將會替換所有匹配的地方
p : 打印與替換命令匹配的行,與 -n 一起使用
w 文件 :將替換的結果寫到文件中
修改selinux開機不自啟配置文件
修改多行,使用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修改全局,后面加g
[root@yxp opt]#sed -i 's/root/admin/g' passwd6.分組調(diào)用
#分組使用()(),調(diào)用第一段使用\1 [root@yxp opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/' 11 #調(diào)用第2個分組 [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提取IP地址
[root@yxp ~]#ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+) (netmask) ([0-9.]+) (broadcast) ([0-9.]+).*/\2/p' 192.168.59.102@和/效果一樣
[root@yxp ~]#echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's@^(.*)/([^/]+)@\2@p'總結
以上是生活随笔為你收集整理的Shell脚本工具三剑客 Sed的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优麒麟系统调整启动项顺序的经验分享
- 下一篇: dsa数字签名c语言编程,DSA 数字签