参数linux
-n 取消默认输出 -i 修改源文件内容 -r 支持扩展正则 -e 容许多项编辑
显示行号shell
grep -n . /etc/passwd cat -n /etc/passwd sed "=" /etc/passwd awk '{print NR,$0}' /etc/passwd less -N /etc/passwd
打印文件第几行 nruby
#显示单行 [root@lb03 ~]# sed -n '1p' passwd root:x:0:0:root:/root:/bin/bash #显示连续的多行 [root@lb03 ~]# sed -n '1,3p' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin #显示不连续的多行 [root@lb03 ~]# sed -n '1p;3p' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@lb03 ~]# sed -n '$p' passwd rlgrtueigh
过滤bash
#过滤以root开头 [root@lb03 ~]# sed -n '/^root/p' passwd root:x:0:0:root:/root:/bin/bash roott [root@lb03 ~]# sed -n '/^ROOT/p' passwd ROOT #过滤以t为结尾的行 [root@lb03 ~]# sed -n '/t$/p' passwd halt:x:7:0:halt:/sbin:/sbin/halt roott #过滤出字符连续的行 [root@lb03 ~]# sed -n '/adm/,/ftp/p' passwd 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 #取出不一样的字符串 [root@lb03 ~]# sed -n '/adm/p;/ftp/p' passwd adm:x:3:4:adm:/var/adm:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@lb03 ~]# sed -rn '/adm|ftp/p' passwd adm:x:3:4:adm:/var/adm:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
删除文件第几行 dless
sed '2,4d' /etc/passwd 删除2-4行 sed '2,$d' /etc/passwd 删除2-末尾行 sed '2d,4d' /etc/passwd 删除2行和4行 sed '1,$d' /etc/passwd 全删 sed '/root/{n;d}' /etc/passwd 删除root下一行 sed '/bin/{N;d}' /etc/passwd 删除bin上一行
追加,插入 a issh
'a' 第三行下方追加oldboy [root@shell /server/scripts]# sed '3a oldboy' pass root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin oldboy adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 'i' 第三行上方追加alex [root@shell /server/scripts]# sed '3i alex' pass root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin alex 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 #在文件的开头添加内容 [root@lb03 ~]# sed '1s/^/oldboy\n/' test.txt oldboy 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 #在文件的结尾加入内容 [root@lb03 ~]# sed '$s/$/\noldgirl/' test.txt 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 oldgirl
替换 ccode
'c' 第四整行替换为mmmmmmmm [root@shell /server/scripts]# sed '4c mmmmmmmm' pass root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin mmmmmmmm lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #包含root的行所有替换为admin [root@lb03 ~]# sed '/root/cadmin' test.txt 's###g' 将lp行的nologin换成ss [root@shell /server/scripts]# sed '/lp/s#nologin#ss#g' pass 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/ss 将adm行的sbin换成yy (有-n 就加p) [root@shell scripts]# sed -n '/adm/s#sbin#yy#gp' pass adm:x:3:4:adm:/var/adm:/yy/nologin #替换多行 s###g [root@lb03 ~]# sed '1,5s#bin#shell#g' test.txt root:x:0:0:root:/root:/shell/bash shell:x:1:1:shell:/shell:/sshell/nologin daemon:x:2:2:daemon:/sshell:/sshell/nologin adm:x:3:4:adm:/var/adm:/sshell/nologin lp:x:4:7:lp:/var/spool/lpd:/sshell/nologin sync:x:5:0:sync:/sbin:/bin/sync #只替换每一行第一个匹配的 s### [root@lb03 ~]# sed '1,5s#bin#shell#' test.txt root:x:0:0:root:/root:/shell/bash shell:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sshell:/sbin/nologin adm:x:3:4:adm:/var/adm:/sshell/nologin lp:x:4:7:lp:/var/spool/lpd:/sshell/nologin sync:x:5:0:sync:/sbin:/bin/sync #忽略大小写替换 i [root@lb03 ~]# sed 's#root#admin#gi' test.txt admin:x:0:0:admin:/admin:/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 'n N' 匹配到root下一行 而后替换 [root@shell /server/scripts]# sed '/root/{n;s#sbin#msy#g}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/msy/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
==案例==:注释定时任务server
sed -n '/ntpdate/s#^###gp' /var/spool/cron/root sed -n '2/s#^###gp' /var/spool/cron/root 把第二行注释了
==案例==:关闭selinuxblog
[root@lb03 ~]# sed '7cSELINUX=enforcing' /etc/sysconfig/selinux [root@lb03 ~]# sed '/^SELINUX=/cSELINUX=enforcing' /etc/sysconfig/selinux
==案例==:更改端口ip
[root@lb03 ~]# sed '/^#Port/cPort 666' /etc/ssh/sshd_config [root@lb03 ~]# sed '17cPort 666' /etc/ssh/sshd_config
将内容写到新的文件中 w
[root@lb03 ~]# sed -n '/root/w file.txt' passwd [root@lb03 ~]# cat file.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin roott [root@lb03 ~]# sed -n '1w file1.txt' passwd [root@lb03 ~]# cat file1.txt root:x:0:0:root:/root:/bin/bash
容许多项编辑 e
[root@lb03 ~]# sed '1,10d' passwd |sed 's#root#123#g' [root@lb03 ~]# sed -e '1,10d' -e 's#root#123#g' passwd
非 !
[root@lb03 ~]# sed -n '1!p' passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@lb03 ~]# sed '1!d' passwd root:x:0:0:root:/root:/bin/bash
暂存和取用 h H g G
'h' 取第一行放暂存区 替换最后一行 [root@shell /server/scripts]# sed '1h;$g' pass 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 root:x:0:0:root:/root:/bin/bash 取第二行放暂存区 替换第三行 [root@shell /server/scripts]# sed '2h;3g' pass root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 'G' 把第一行放到暂存区 在最后一行调用 (不是替换,是追加) [root@shell /scripts]# sed '1h;$G' pass 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 root:x:0:0:root:/root:/bin/bash '{h}' 把第一行内容放暂存区并删除 最后一行调用 [root@shell /server/scripts]# sed -r '1{h;d};$G' pass 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 root:x:0:0:root:/root:/bin/bash 'g' 把第一行放暂存区 从第二行到最后一行替换 [root@shell /server/scripts]# sed -r '1h;2,$g' pass root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash 'H' [root@shell /server/scripts]# sed -r '1h;2,3H;$G' pass 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 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@lb03 ~]# cat file.txt 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 [root@lb03 ~]# sed 's/^[ \t#]*/#/g' file.txt #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
sed 后向引用
所有注释
[root@shell /server/scripts]# sed 's/.*/#&/g' acce = sed -r 's/(.*)/#\1/g' passwd (.*:全部字符 #&:注释并执行.* 若是不加# 就会默认所有替换成# 就是一例#) #\1:换成# 第一个括号里的值 #当前IP为:111.78.80.213 对应出现的次数是: 2 #当前IP为:42.114.204.31 对应出现的次数是: 1 #当前IP为:101.132.102.45 对应出现的次数是: 22 [root@shell /server/scripts]# sed 's/.*/&/g' acce = sed -r 's/(.*)/\1/g' acce (.*:全部字符 \1:第一个括号的值) 当前IP为:111.78.80.213 对应出现的次数是: 2 当前IP为:42.114.204.31 对应出现的次数是: 1 当前IP为:101.132.102.45 对应出现的次数是: 22
==案例==:取ip地址
[root@shell /server/scripts]# ip a s eth0 s是指定网卡 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group link/ether 00:0c:29:55:c6:31 brd ff:ff:ff:ff:ff:ff inet 10.0.0.3/24 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe55:c631/64 scope link valid_lft forever preferred_lft forever [root@lb03 ~]# ip a s eth0 |sed -nr '3s#(.*t )(.*)(/.*)#\2#gp' 10.0.0.3 -n 取消默认输出 -r 支持扩展正则 3 s#(.*t ) (.*) (/.*)# \2#gp 第3行 开始到空格结束 输出剩余 从/开始到结束 值是第2个括号里的
==案例==:把passwd文件中的第一列与第七列进行位置调换
[root@lb03 ~]# sed -r 's#(.*)(:x.*:)(.*)#\3\2\1#g' passwd /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
sed -r 's#(.*)#\1 alex#g' 1.txt echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;`echo $RANDOM|md5sum|cut -c1-8`|passwd --stdin \1#g'