sed:是一种文本流编辑器,主要进行过滤匹配并替换的功能。可以完美支持正则表达式,他把当前处理的文本行存储在临时缓冲区(模式空间),而后进行处理,把处理结果输出到屏幕当中,接着再处理下一文本行,直到文件末尾。正则表达式
命令格式:sed [选项] '模式(命令+表达式)' 文件名bash
sed 不加选项,p命令会输出打印匹配的行和文件全部行,因此会有重复的行出现。ssh
[root@lgs-01 sed]# sed '/root/ p' passwdtest root:x:0:0:root:/root:/bin/bash 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 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 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash
-n选项:只输出匹配的行,与打印命令 p 一块儿使用。编辑器
sed -n '/root/ p' test.txt:输出打印包含root的行 。要匹配的关键词在 / /号中,或者其余符号例如 @post
[root@lgs-01 sed]# sed -n '/root/ p' passwdtest root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
-r选项:支持扩展表达式,意思是不用对特殊字符进行转义。就与grep的 -E选项相似。命令行
sed -nr '/r+o/ p' test.txt:输出打印匹配 ro 或者 nr(n表明多个) o 的行。+号表明前面单字符有1个或者多个code
[root@lgs-01 sed]# sed -nr '/r+o/ p' passwdtest root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sed -n '2 p' test.txt :输出打印文件的第二行。字符串
[root@lgs-01 sed]# sed -n '2 p' passwdtest bin:x:1:1:bin:/bin:/sbin/nologin
sed -n '5,$ p' test.txt :输出打印文件的第5行到尾行。 $ 表明尾行的意思it
[root@lgs-01 sed]# sed -n '5,$ p' passwdtest 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash
sed -n '2,6 p' test.txt:输出打印文件的第2到6行。test
[root@lgs-01 sed]# sed -n '2,4 p' passwdtest 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
sed -n '/^a/ p' test.txt:输出打印以a开头的行。^号表明 之后面字符开头
[root@lgs-01 sed]# sed -n '/^a/ p' passwdtest adm:x:3:4:adm:/var/adm:/sbin/nologin abc:x:1001:1000::/home/abc:/bin/bash abc:0 abc:y
sed -n '/r*o/ p' test.txt :输出打印匹配o 或者nr(n表明多个) o 的行。*号表明前面单字符有0个或者多个
[root@lgs-01 sed]# sed -n '/r*o/ p' passwdtest 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 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 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 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash rooot rooroot rorororororororo rorororororororot rot
sed -n '/in$/ p' test.txt:输出打印以in结尾的行,$表示以他前面字符结尾的意思。
[root@lgs-01 sed]# sed -n '/in$/ p' passwdtest 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 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sed -n '/r..o/ p' test.txt:输出打印匹配 r..o 的行。 .号表示单个字符,包括空格符。
[root@lgs-01 sed]# sed -n '/r..o/ p' passwdtest operator:x:11:0:operator:/root:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin rooot rorororororororo rorororororororot rorororo
-e选项:在一个命令行中 ,执行多个命令动做,命令动做生效一次就直接输出一次结果,而后再执行下一个命令动做。若是命令动做的输出内容有重合,则会重复显示。
sed -e '1 p' -e '/root/ p' -e '/oo*/ p' -n test.txt:
[root@lgs-01 sed]# sed -e '1 p' -e '/root/ p' -e '/oo*/ p' -n passwdtest root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash 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 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/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 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash rooot rooroot rooroot rorororororororo rorororororororot rot rorororo oooo r..o
大 I 命令:不区分大小写
sed -n '/user/ Ip' test.txt :
[root@lgs-01 sed]# sed -n '/user/ Ip' passwdtest ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin
d命令:删除匹配的行后显示剩余的行,不删除原文件内容。不用p打印p命令均可以输出打印。
sed '1,36 d' test.txt:删除文件中的第1到36行,输出打印剩余的行。
[root@lgs-01 sed]# sed '1,36 d' passwdtest t t rorororo oooo n r..o
sed '/nologin/ d' test.txt:删除匹配nologin的行,输出打印剩余的行。
[root@lgs-01 sed]# sed '/nologin/ d' passwdtest root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash
-i选项:直接修改原文件的内容:
sed -i '25,$ d' test.txt :删除文件中的第25行到尾行,直接在原文件中删除。
[root@lgs-01 sed]# sed -i '25,$ d' passwdtest [root@lgs-01 sed]# cat passwdtest 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash 12:22:55 587:1 12:21
s命令:替换指定的字符串
sed '1,10s/root/toor/ g' test.txt :前10行的root 替换成 toor 。g参数表明全局替换,不加g,只替换每行的第一个匹配的字符串。
[root@lgs-01 sed]# sed -n '1,10s/root/toor/ p' passwdtest toor:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/toor:/sbin/nologin [root@lgs-01 sed]# sed -n '1,10s/root/toor/g p' passwdtest toor:x:0:0:toor:/toor:/bin/bash operator:x:11:0:operator:/toor:/sbin/nologin
要被替换的字符串是支持正则表达式的:
sed -r '1,10s/ro+/r/ g' test.txt :前10行的 ro或者 rno(n表明多个) 替换成 r 。
[root@lgs-01 sed]# sed -nr '1,10s/ro+/r/g p' passwdtest rt:x:0:0:rt:/rt:/bin/bash operator:x:11:0:operator:/rt:/sbin/nologin
sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/':以冒号: 为分割,第一段和最后一段对调。\1 \2 \3 表明对应前面的第一、二、3个( )号中内容。
[root@lgs-01 sed]# cat passwdtest 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash 12:22:55 587:1 12:21 [root@lgs-01 sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' passwdtest /bin/bash:x:0:0:root:/root:root /sbin/nologin:x:1:1:bin:/bin:bin /sbin/nologin:x:2:2:daemon:/sbin:daemon /sbin/nologin:x:3:4:adm:/var/adm:adm /sbin/nologin:x:4:7:lp:/var/spool/lpd:lp /bin/sync:x:5:0:sync:/sbin:sync /sbin/shutdown:x:6:0:shutdown:/sbin:shutdown /sbin/halt:x:7:0:halt:/sbin:halt /sbin/nologin:x:8:12:mail:/var/spool/mail:mail /sbin/nologin:x:11:0:operator:/root:operator /sbin/nologin:x:12:100:games:/usr/games:games /sbin/nologin:x:14:50:FTP User:/var/ftp:ftp /sbin/nologin:x:99:99:Nobody:/:nobody /sbin/nologin:x:192:192:systemd Network Management:/:systemd-network /sbin/nologin:x:81:81:System message bus:/:dbus /sbin/nologin:x:999:997:User for polkitd:/:polkitd /sbin/nologin:x:89:89::/var/spool/postfix:postfix /sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd /sbin/nologin:x:998:996::/var/lib/chrony:chrony /bin/bash:x:1008:1000::/home/lgs:lgs /bin/bash:x:1001:1000::/home/abc:abc 55:22:12 587:1 12:21
sed 's/[a-zA-Z]// g' test.txt:把全部的字母删掉,替换成空。
[root@lgs-01 sed]# sed 's/[a-zA-Z]// g' passwdtest ::0:0::/:// ::1:1::/:// ::2:2::/:// ::3:4:://:// ::4:7::///:// ::5:0::/:// ::6:0::/:// ::7:0::/:// ::8:12::///:// ::11:0::/:// ::12:100:://:// ::14:50: ://:// ::99:99::/:// -::192:192: :/:// ::81:81: :/:// ::999:997: :/:// ::89:89::///:// ::74:74:- :///:// ::998:996::///:// ::1008:1000:://:// ::1001:1000:://:// 12:22:55 587:1 12:21
sed -r 's/(.*)/aaa:&/' test.txt :在全部行前面加 aaa: 。&号表明 前面( )号匹配的一段字符串,也能够用 \1 表示
[root@lgs-01 sed]# sed -r 's/(.*)/aaa:&/ ' passwdtest aaa:root:x:0:0:root:/root:/bin/bash aaa:bin:x:1:1:bin:/bin:/sbin/nologin aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin aaa:sync:x:5:0:sync:/sbin:/bin/sync aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown aaa:halt:x:7:0:halt:/sbin:/sbin/halt aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin aaa:operator:x:11:0:operator:/root:/sbin/nologin aaa:games:x:12:100:games:/usr/games:/sbin/nologin aaa:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin aaa:nobody:x:99:99:Nobody:/:/sbin/nologin aaa:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin aaa:dbus:x:81:81:System message bus:/:/sbin/nologin aaa:polkitd:x:999:997:User for polkitd:/:/sbin/nologin aaa:postfix:x:89:89::/var/spool/postfix:/sbin/nologin aaa:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin aaa:chrony:x:998:996::/var/lib/chrony:/sbin/nologin aaa:lgs:x:1008:1000::/home/lgs:/bin/bash aaa:abc:x:1001:1000::/home/abc:/bin/bash aaa:12:22:55 aaa:587:1 aaa:12:21