處理文本的工具sed
Stream EDitor 行編輯器
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space ),接著用sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。sed 主要用來自動編輯一個或多個文件, 簡化對文件的反復操作,編寫轉換程序等。
sed 工具
用法:
sed [option]… ‘script’ inputfile…
常用選項:
-n:不輸出模式空間內容到屏幕,即不自動打印
-e:多點編輯
-f:/ PATH/SCRIPT_FILE : 從指定文件中讀取編輯腳本
-r:支持使用擴展正則表達式
-i.bak:備份文件并原處編輯
script:
‘地址命令‘
地址定界:
(1)不給地址:對全文進行處理
(2)單地址:
#:指定的行
/pattern/:被此處模式所能夠匹配到的每一行
(3)地址范圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~ :步進
1~2 奇數行
2~2 偶數行
編輯命令:
d:刪除模式空間匹配的行
p:顯示模式空間中的內容
a [\]text:在指定行后面追加文本
支持使用\n實現多行追加
i [\]text:在行前面插入文本
c [\]text:替換行為單行或多行文本
w /path/somefile:保存模式匹配的行至指定文件
r /path/somefile:讀取指定文件的文本至模式空間中
匹配到的行后
=:為模式空間中的行打印行號
!:模式空間中匹配取反處理
s/// :查找替換, 支持使用其它分隔符,s@@@ ,s###
替換標記:
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE :將替換成功的行保存至文件中
實例:
顯示/etc/passwd中的內容
[root@localhost ~]#sed 'p' /etc/issue CentOS release 6.8 (Final) CentOS release 6.8 (Final) Kernel \r on an \m Kernel \r on an \m [root@localhost ~]#sed -n 'p' /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m
打印出第五行
[root@localhost ~]#sed -n '5p' /etc/passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
在輸入第二行時,會再打印一遍
[root@localhost ~]#sed -n '2p' a b b c
可配合管道及重定向使用
[root@localhost ~]#sed -n '2p' < /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost ~]#sed -n '2p' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost ~]#cat /etc/passwd | sed -n '2p' bin:x:1:1:bin:/bin:/sbin/nologin
sed可處理前面命令的輸出
[root@localhost ~]#seq 10 | sed -n '9p' 9
打印/etc/passwd中root開頭的行
[root@localhost ~]#sed -n '/^root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash
打印出/etc/passwd中的10到20行
[root@localhost ~]#sed -n '10,20p' /etc/passwd 10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin 12 games:x:12:100:games:/usr/games:/sbin/nologin 13 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin 14 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 15 nobody:x:99:99:Nobody:/:/sbin/nologin 16 dbus:x:81:81:System message bus:/:/sbin/nologin 17 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin 18 rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin 19 rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin 20 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
打印以h開頭的行到以n開頭的行的所有內容
[root@localhost ~]#sed -n '/^h/,/^n/p' /etc/passwd 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 haldaemon:x:68:68:HAL daemon:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin
奇數或偶數步進
[root@localhost ~]#seq 10 | sed -n '1~2p' 1 3 5 7 9 [root@localhost ~]#seq 10 | sed -n '2~2p' 2 4 6 8 10
刪除/etc/passwd偶數行
[root@localhost ~]#cat -n /etc/passwd | sed '2~2d' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin
在/etc/passwd 一至三行后追加文本
[root@localhost ~]#cat /etc/passwd | sed '1,3a------Rookie' root:x:0:0:root:/root:/bin/bash ------Rookie bin:x:1:1:bin:/bin:/sbin/nologin ------Rookie daemon:x:2:2:daemon:/sbin:/sbin/nologin ------Rookie adm:x:3:4:adm:/var/adm:/sbin/nologin [root@localhost ~]#cat /etc/passwd | sed '1,3a\ ------Rookie' root:x:0:0:root:/root:/bin/bash ------Rookie bin:x:1:1:bin:/bin:/sbin/nologin ------Rookie daemon:x:2:2:daemon:/sbin:/sbin/nologin ------Rookie adm:x:3:4:adm:/var/adm:/sbin/nologin
在二至四行前面追加文本,相當于在一至三行后
[root@localhost ~]#cat -n /etc/passwd | sed '2,4i\ ------Rookie' 1 root:x:0:0:root:/root:/bin/bash ------Rookie 2 bin:x:1:1:bin:/bin:/sbin/nologin ------Rookie 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ------Rookie 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
替換二至四行為——Rookie
[root@localhost ~]#cat -n /etc/passwd | sed '2,4c\------Rookie' 1 root:x:0:0:root:/root:/bin/bash ------Rookie 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync
可用\n實現多行追加
[root@localhost ~]#cat -n /etc/passwd | sed '2,4c\------Rookie \n======' 1 root:x:0:0:root:/root:/bin/bash ------Rookie ====== 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
將/etc/passwd的三至六行保存至指定文件
[root@localhost ~]#cat /etc/passwd | sed -n '3,6w shiyan' [root@localhost ~]#cat shiyan 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
為匹配的行打印行號
[root@localhost ~]#cat /etc/passwd | sed '1,10=' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
將文件中的二至五行刪除
[root@localhost ~]#seq 10 > shiyan [root@localhost ~]#sed -i '2,5d' shiyan [root@localhost ~]#cat shiyan 1 7 8 9 10
[root@localhost ~]#cat /etc/passwd root:x:0:0:root:/root:/bin/bash [root@localhost ~]#sed 's/root/ROOT/g' /etc/passwd ROOT:x:0:0:ROOT:/ROOT:/bin/bash [root@localhost ~]#sed -n 's/root/ROOT/gp' /etc/passwd ROOT:x:0:0:ROOT:/ROOT:/bin/bash operator:x:11:0:operator:/ROOT:/sbin/nologin [root@localhost ~]#sed -n 's@root@ROOT@gp' /etc/passwd ROOT:x:0:0:ROOT:/ROOT:/bin/bash operator:x:11:0:operator:/ROOT:/sbin/nologin
sed -n '2p' /etc/passwd 只打印第二行 sed -n '1,4p' /etc/passwd 打印一至四行 sed -n '/root/p' /etc/passwd 打印包含root的行 sed -n '2,/root/p' /etc/passwd sed -n '/^$/=' /etc/fstab 顯示空行行號 sed -n -e '/^$/=' -e '/^U/=' /etc/fstab 打印空行行號和U開頭行的行號 sed -n '/^$/=' -e '/^U/p' /etc/fstab 打印空行行號和U開頭的行 sed -n -e '/^U/=' -e '/^U/p' /etc/fstab 打印行號并打印行內容 sed '/root/a\Rookie' /etc/passwd 行后 在符合條件的行后添加Rookie sed '/root/i\Rookie' /etc/passwd 行前 在符合條件的行前添加Rookie sed '/root/c\Rookie' /etc/passwd 代替行 用Rookie代替符合條件的行
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x:把模式空間中的內容與保持空間中的內容進行互換
n:讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d:刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不再傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
取奇偶數
[root@localhost ~]#seq 10 | sed 'n;d' 1 3 5 7 9 [root@localhost ~]#seq 10 | sed -n 'n;p' 2 4 6 8 10
倒序顯示
[root@localhost ~]#seq 10 | sed '1!G;h;$!d' 或者seq 10 | sed -n '1!G;h;$p' 10 9 8 7 6 5 4 3 2 1
最后兩行
[root@localhost ~]#seq 10 | sed '$!N;$!D' 9 10
最后一行
[root@localhost ~]#seq 10 | sed '$!d' 10
每行后加空行
[root@localhost ~]#seq 10 | sed '/^$/d;G' 1 2 3 4 5 6 7 8 9 10
使用技巧:
取IP地址
[root@localhost ~]#ifconfig eth0 | sed -n 2p | sed -e 's/.*r://' -e 's/B.*//' 192.168.101.128 [root@localhost ~]#ifconfig eth0 | sed '2!d;s/^.*r://;s/ .*//' 192.168.101.128
取文件名
[root@localhost ~]#echo /etc/sysconfig/network-scripts/ | sed -r 's@(^/.*/)([^/]+/?)@\1@' /etc/sysconfig/
取基名
[root@localhost ~]#echo /etc/sysconfig/network-scripts/ | sed -r 's@(^/.*/)([^/]+/?)@\2@' network-scripts/
對/etc/fstab中非#號開頭的行加注釋符
[root@localhost ~]#sed -r 's/(^[^#])/#\1/' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Mar 24 05:37:40 2017 # # 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=1fd1710f-ff1a-4eba-94f8-c57ecc05d6c6 / ext4 defaults 1 1 #UUID=34e5ffbe-c2b3-4745-89bc-1811245ae758 /boot ext4 defaults 1 2 #UUID=abf30893-850f-4a50-9a0c-e5e153873eb4 /data ext4 defaults 1 2 #UUID=53e082c2-f1fc-4b96-aa31-d9071dc6355c /home ext4 defaults 1 2 #UUID=7a8216c5-6781-4494-b2da-fda672f117ad 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/inittab文件中的空行
[root@localhost ~]#cat /etc/inittab # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, [root@localhost ~]#sed '/^$/d' /etc/inittab # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
原創文章,作者:Linux.rookie,如若轉載,請注明出處:http://www.www58058.com/76601