sed是一款流編輯器工具,通常我們用來對文本進行過濾與替換操作,特別是當你想要對幾十個配置文件做統一更改時,你會感受到sed的魅力。它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸出。sed的工作流程如下圖所示:
sed:Stream EDitor,行編輯器
用法: sed [選項]… {腳本(如果沒有其他腳本)} [輸入文件]…
常用選項:
-e:多點編輯
-f /PATH/TO/SCRIPT_FILE:從指定文件中讀取編輯腳本:
-r:支持使用擴展正則表達式
-n:不輸出模式中的內容至屏幕
-i: 原處編輯
?。喝》礂l件
s/查找的條件/替換的內容/:
s@@@ s###
編輯命令:
a,append表示追加指令
i,insert表示插入指令
d,delete表示刪除指令
s,substitution表示替換指令
p,顯示模式空間中的內容
w /path/to/somefile:保存模式空間中的內容到指定文件中
r /path/to/somefile: 讀取指定文件的文件流至模式空間中的行(能匹配到的行)
=:為模式空間中的行打印行號
關于d刪除的用法:
[root@C67-X64-A1 ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
# 刪除以UUID開頭的行:
[root@C67-X64-A1 ~]# sed '/^UUID/d' /etc/fstab # # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
# 刪除以#開頭的行
[root@C67-X64-A1 ~]# sed '/^#/d' /etc/fstab UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 You have new mail in /var/spool/mail/root
# 刪除空白行
[root@C67-X64-A1 ~]# sed '/^$/d' /etc/fstab # # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
# 在/tmp/fst的第二行后面插入"wanwan=3"
[root@C67-X64-A1 ~]# sed -i '2a wanwan=3' /tmp/fst You have new mail in /var/spool/mail/root [root@C67-X64-A1 ~]# cat /tmp/fst # wanwan=3 # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
# 將“wanwan=3”替換成“wanwan=5”
[root@C67-X64-A1 ~]# sed -i 's/wanwan=3/wanwan=5/g' /tmp/fst [root@C67-X64-A1 ~]# cat /tmp/fst # I am the third I am the forth/p wanwan=5 # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
# 刪除1-5行的內容,i(inplace)直接就可以生效了,建議先測試后,然后再用“-i”參數
[root@C67-X64-A1 ~]# sed -i '1,5d' /tmp/fst [root@C67-X64-A1 ~]# cat /tmp/fst # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
# 在UUID的行后,直接加上“TYPE=test”
[root@C67-X64-A1 ~]# cat /tmp/fst # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 [root@C67-X64-A1 ~]# sed '/^UUID/a TYPE=test' /tmp/fst # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 TYPE=test UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 TYPE=test UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 TYPE=test UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 TYPE=test tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
在#行開頭的后面添加一行內容
[root@C67-X64-A1 ~]# sed '/^#/a \#我們需要努力!' /tmp/fst # /etc/fstab #我們需要努力! # Created by anaconda on Tue Jul 5 23:40:37 2016 #我們需要努力! # #我們需要努力! # 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 #我們需要努力! # #我們需要努力! UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
在#行開頭的前面添加一行內容"我們不要放棄!"
[root@C67-X64-A1 ~]# sed '/^#/i \#我們不要放棄!' /tmp/fst #我們不要放棄! # /etc/fstab #我們不要放棄! # Created by anaconda on Tue Jul 5 23:40:37 2016 #我們不要放棄! # #我們不要放棄! # 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 #我們不要放棄! # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
#將/etc/fstab中將以UUID開頭的行存入到/root/fstab中
[root@C67-X64-A1 ~]# sed -n '/^UUID/w /root/fstab' /etc/fstab [root@C67-X64-A1 ~]# cat /root/fstab UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0
# 將/root/write.txt文件讀入到/etc/fstab的第六行
[root@C67-X64-A1 ~]# awk -F ":" '{print $1}' /etc/passwd|head -5>/root/write.txt [root@C67-X64-A1 ~]# cat /root/write.txt root bin daemon adm lp [root@C67-X64-A1 ~]# sed '6r /root/write.txt' /etc/fstab # # /etc/fstab # Created by anaconda on Tue Jul 5 23:40:37 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' root bin daemon adm lp # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
#對write.txt文件執行sed.sh腳本指令
[root@C67-X64-A1 ~]# cat sed.sh # this is a test sed command /^$/d [root@C67-X64-A1 ~]# sed -f sed.sh write.txt root oo bin daemon adm lp
練習1:刪除/boot/grub/grub.conf文件中所有以空白開頭的行行首的空白字符
[root@C67-X64-A1 ~]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda5 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS 6 (2.6.32-573.el6.x86_64) root (hd0,0) kernel /tboot.gz logging=vga,serial,memory module /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 intel_iommu=on amd_iommu=on rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=128M.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet module /initramfs-2.6.32-573.el6.x86_64.img [root@C67-X64-A1 ~]# sed 's#^[[:space:]]\+##' /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda5 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS 6 (2.6.32-573.el6.x86_64) root (hd0,0) kernel /tboot.gz logging=vga,serial,memory module /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 intel_iommu=on amd_iommu=on rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=128M.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet module /initramfs-2.6.32-573.el6.x86_64.img
練習2:刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首和空白字符
[root@C67-X64-A1 ~]# sed 's@^#[[:space:]]\+@@' /etc/fstab # /etc/fstab Created by anaconda on Tue Jul 5 23:40:37 2016 # 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 # UUID=922eb46f-7e6e-4670-8bf1-6f9f1b05a053 / ext4 defaults 1 1 UUID=3881dbb7-5500-4eff-ba82-17651d436ce5 /boot ext4 defaults 1 2 UUID=419bb1cd-93b2-403b-9bf2-847d3072248b /tmp ext4 defaults 1 2 UUID=bcb87417-3008-4fcc-80d7-41c3ef9ff96c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
練習3:echo一個絕對路徑路徑sed命令,取出其基名:取出其目錄名
目錄名稱: [root@C67-X64-A1 ~]# echo "/etc/sysconfig"|sed 's@[^/]\+/\?$@@' /etc/ [root@C67-X64-A1 ~]# echo "/etc/sysconfig/"|sed 's@[^/]\+/\?$@@' /etc/ 基名: [root@C67-X64-A1 ~]# echo "/etc/sysconfig/" | sed -r 's@^/.*/([^/]+)/?@\1@g' sysconfig [root@C67-X64-A1 ~]# echo "/etc/sysconfig" | sed -r 's@^/.*/([^/]+)/?@\1@g' sysconfig
# 執行多個指令的方法
[root@C67-X64-A1 tmp]# cat eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=dhcp 方法1: [root@C67-X64-A1 tmp]# sed -e 's/yes/no/' -e 's/eth0/ens32/' eth0 DEVICE=ens32 TYPE=Ethernet ONBOOT=no NM_CONTROLLED=no BOOTPROTO=dhcp 方法2:利用分號隔開 [root@C67-X64-A1 tmp]# sed 's/yes/no/;s/eth0/ens32/' eth0 DEVICE=ens32 TYPE=Ethernet ONBOOT=no NM_CONTROLLED=no BOOTPROTO=dhcp 方法3:利用分行 [root@C67-X64-A1 tmp]# sed ' > s/yes/no/ > s/eth0/ens32/' eth0 DEVICE=ens32 TYPE=Ethernet ONBOOT=no NM_CONTROLLED=no BOOTPROTO=dhcp
# 操作地址匹配
sed -n '1~2p' /etc/passwd
# 刪除/tmp/passwd的前5行
[root@C67-X64-A1 tmp]# head -10 /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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 刪除后,然后進行對比: [root@C67-X64-A1 tmp]# sed -i '1,5d' /tmp/passwd [root@C67-X64-A1 tmp]# cat /tmp/passwd |head -10 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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin
# 替換第二個body位/body
[root@C67-X64-A1 ~]# cat test.txt <html> <title>First Web</title> <body>hello world!<body> </html> [root@C67-X64-A1 ~]# cat sed.sh /body/{ s//\/body/2 } [root@C67-X64-A1 ~]# sed -f sed.sh test.txt <html> <title>First Web</title> <body>hello world!</body> </html>
# 利用 sed 直接在 /tmp/passwd 最后一行加入『# This is a test』
# sed -i '$a # This is a test' /tmp/passwd # 先不用-i命令,進行測試下 [root@zabbix ~]# sed '$a # this is a test' /tmp/passwd |tail -5 awx:x:988:985::/var/lib/awx:/bin/bash li4:x:1011:1011::/home/li4:/bin/bash admin:x:1012:1012::/home/admin:/sbin/nologin monitor:x:1013:1013::/home/monitor:/bin/bash # this is a test 說明: a)由于$代表的是最后一行,而 a 的動作是新增,因此該文件最后新增『# This is a test』! b)sed 的『 -i 』選項可以直接修改文件內容,這功能非常有幫助! c)舉例來說,如果你有一個 100 萬行的文件,你要在第 100 行加某些文字,此時使用 vim 可能會瘋掉!因為文件太大了!那怎辦? 就利用 sed ??!透過 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修訂!
#在/tmp/passwd第二行后面添加"# this is a test"
[root@zabbix ~]# sed '2a # this is a test' /tmp/passwd |head -5 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin # this is a test daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
# 利用 sed 將passwd內每一行結尾若為 . 則換成 !
[root@zabbix tmp]# cat passwd James is a good man . Kobe is good at IT . I love Linux. welcome to linux. [root@zabbix tmp]# sed 's/\.$/\!/g' passwd James is a good man ! Kobe is good at IT ! I love Linux! welcome to linux! 使用-i參數才會真正的生效
原創文章,作者:Net21-冰凍vs西瓜,如若轉載,請注明出處:http://www.www58058.com/25966