Sed

sed

參數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'

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息