sed---流文本操作

一:sed基本命令

sed的使用格式

sed [optiona] ‘command’ files

sed 参数[-nefir] 动作[n1,[n2]] function
sed -n:只有经过sed特殊处理的那些行才会被列出来
-e:直接在命令行模式上进行sed的动作编辑
-f:直接将sed的动作写在文件里,-f filename则可以执行filename内的动作
-r:sed的动作支持的是扩展正则表达式,读取指定文件的内容
-i:直接修改读取到的文件的内容,而不是屏幕输出
n1,n2一般代表执行动作的行,也可以用正则表达式
function:
a:新增
c:替换
d:删除
i:插入行
p:打印
s:替换

1:以行为单位新增/删除功能

1:将/etc/passwd.bak的内容列出来并且打印行号,同时删除第2-5行
[root@localhost etc]# nl /etc/passwd.bak  |sed '2,5d'    #删除2到5行

[root@localhost etc]# nl /etc/passwd.bak  |sed '2d'		 #删除第2行
[root@localhost etc]# nl /etc/passwd.bak  |sed '2,$d'     #删除2行到最后一行
     1  root:x:0:0:root:/root:/bin/bash
[root@localhost tmp]# sed '/^$/d'  passwd.bak             #删除空行

2:在第二行后面,也就是第3行上,加上“I love batman!”

[root@localhost etc]# nl /etc/passwd.bak | sed '2a  I love batman! ' 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
I love batman! 
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
   ...
 
3:添加多行
nl /etc/passwd.bak | sed '2a  I love batman! ... \ [敲一下回车]
> ssssss '   
#以'结束多行内容
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
I love batman! ... 
ssssss 
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ...
    
    
    #模式匹配的方式
    sed '/2004/a\China'   xxxx.txt   #希望在2004的下一行添加China
    sed '/2004/i\China'   xxxx.txt  #希望在2004的前一行添加China
4:$:最后一行---在文档最后一行添加I love linux
[root@localhost tmp]# nl passwd.bak  | sed '$a I love linx '

2:以行为单位替换/打印

1:将第2-5行的内容替换为“No 2-5 number”
[root@localhost etc]# nl /etc/passwd.bak | sed '2,5c no 2-5 number'
     1  root:x:0:0:root:/root:/bin/bash
no 2-5 number
     6  sync:x:5:0:sync:/sbin:/bin/sync
    ...
    
2:简单直接取出你想要的行数
[root@localhost etc]# nl /etc/passwd.bak | sed '2,5p'        #2-5行会重复输出
[root@localhost etc]# nl /etc/passwd.bak | sed -n '2,5p'     #加上-n,只输出2-5行
     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 etc]# sed -n '/root/p'  passwd.bak   #把包含murex字符的行输出,别忘记加上-n参数
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin 
 

3:以行为单位进行部分数据的查找以及替换的功能------可以批量处理配置文件

-s替换:分隔符/,#等等 加g:全局替换

1:直接修改文件的内容
[root@localhost etc]#  sed -in 's/n$/\!/g'  passwd.bak   #将每一行结尾的n替换为!,注意转义
[root@localhost tmp]# ifconfig eno16777728  | sed -n '/inet /p' | sed  's/inet//g' | sed 's/net.*$//'  #取出IP地址

4:!取反,不打印某些行

1:不打印5到10行
[root@localhost tmp]# nl passwd.bak | sed -n '5,10!p' 

5:定位间隔几行 first~step

1:间隔行输出,输出单行,第一行开始
[root@localhost tmp]# nl passwd.bak |sed -n '1~2p' 
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologi!
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdow!
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologi!
    11  games:x:12:100:games:/usr/games:/sbin/nologi!
    13  nobody:x:99:99:Nobody:/:/sbin/nologi!
    15  polkitd:x:999:998:User for polkitd:/:/sbin/nologi!
    17  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologi!
    19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologi!

6:以行为单位插入数据

1;在1-5行,每行前插入 I love linux
[root@localhost tmp]# nl passwd.bak | sed  '1,5i   I love linux'  
I love linux
     1  root:x:0:0:root:/root:/bin/bash
I love linux
     2  bin:x:1:1:bin:/bin:/sbin/nologi!
I love linux
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologi!
I love linux
     4  adm:x:3:4:adm:/var/adm:/sbin/nologi!
I love linux
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
2:使用\来转义空格,使其对其
[root@localhost tmp]# nl passwd.bak | sed  '1,5i\       I love linux' 
       I love linux
     1  root:x:0:0:root:/root:/bin/bash
       I love linux
     2  bin:x:1:1:bin:/bin:/sbin/nologi!
       I love linux
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologi!
       I love linux
     4  adm:x:3:4:adm:/var/adm:/sbin/nologi!
       I love linux
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!

二:高级操作命令

1:-{} :多个sed命令,用;分开

1:删除5-10行,再进行替换操作
[root@localhost tmp]# nl passwd.bak | sed '{5,10d;s/oracle/root/}'

2: -n:读取下一个输入行(用下一个命令处理)-----{}里面的n

1:操作偶数行-----调第一行的时候,读取出第二行:打印,以此类推
[root@localhost tmp]# nl passwd.bak | sed -n '{n;p}'  
[root@localhost tmp]# nl passwd.bak | sed -n '2~2p'   #第2行开始,间隔行为2
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     8  halt:x:7:0:halt:/sbin:/sbin/halt
    10  operator:x:11:0:operator:/root:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    14  dbus:x:81:81:System message bus:/:/sbin/nologin
    16  avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    20  oracle:x:1000:1000:oracle:/home/oracle:/bin/bash
2:操作奇数行
[root@localhost tmp]# nl passwd.bak | sed -n '{p;n}'
[root@localhost tmp]# nl passwd.bak | sed -n '1~2p'  #第1行开始,间隔行为2
     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  games:x:12:100:games:/usr/games:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    15  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    17  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
    19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

3:-&:替换固定字符串----替换操作的优化

1:把passwd中的用户后面都添加上4个空格
[root@localhost tmp]#  sed 's/^[a-z_-]\+/&    /' passwd.bak
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

4:元字符(\u,\l,\U,\L) :转换为大写,小写:\u,\l对首字母,\U,\L对一串字符

[root@localhost tmp]#  sed 's/^[a-z_-]\+/\u&/' passwd.bak   #首字母转换为大写
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@localhost tmp]#  sed 's/^[a-z_-]\+/\U&/' passwd.bak    #匹配字符串全部转换为大写
[root@localhost tmp]#  sed 's/^[a-z_-]\+/\l&/' passwd.bak	 #首字母转换为小写
[root@localhost tmp]#  sed 's/^[a-z_-]\+/\L&/' passwd.bak	#匹配字符串首字母转换为小写

5:-( ) : 替换某种(部分)字符串\1,\2

1:获取ip的另一种思路
[root@localhost tmp]# ifconfig eno16777728 |grep netmask|   sed 's/\(inet\)\(.*\)\(net.*\)/\2/'
         192.168.1.10
[root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'|   sed 's/\(inet\)\(.*\)\(net.*\)/\2/'          192.168.1.10
[root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'| sed 's/inet \([0-9.]\+.*\) net.*/\1/ ' 
        192.168.1.10 
2:获取passwd种的USER,UID,GID
[root@localhost tmp]# sed  's/\(^[a-z_-]\+\):.*$/\1/'  passwd.bak  #第一步
[root@localhost tmp]# sed  's/\(^[a-z_-]\+\):x:\([0-9]\+\):.*$/\1:\2/'  passwd.bak  #第二步
[root@localhost tmp]# sed  's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/\1:\2:\3/'  passwd.bak   
root:0:0
bin:1:1
daemon:2:2
adm:3:4
lp:4:7
sync:5:0
shutdown:6:0
halt:7:0
mail:8:12

#### \d判断的不只是0-9,而是一个 Unicode 字符集

6:-r复制指定文件插入到匹配行-----不改变文件内容

​ -w:复制匹配行拷贝到指定文件里

1:
[root@localhost tmp]# echo -e  "123\n456\n789" > 123.txt
[root@localhost tmp]# cat 123.txt 
123
456
789
[root@localhost tmp]# echo -e "abc\ndef\nxyz"  > abc.txt
[root@localhost tmp]# cat abc.txt 
abc
def
xyz
[root@localhost tmp]# sed '1r 123.txt' abc.txt   ### 读123.txt这个文件,并插入到abc.txt的第1行中
abc
123
456
789
def
xyz 

2:-w:改写内容,把123.txt的第一行写入到abc.txt中
[root@localhost tmp]# sed '1w abc.txt' 123.txt 
123
456
789
[root@localhost tmp]# cat abc.txt      #abc的原内容会被覆盖
123

7:-q退出

1:到第5行就退出sed
[root@localhost tmp]# nl passwd.bak | sed '5q' 
     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
     

8:识别空格和制表符(tab)

[root@localhost tmp]# cat tab_space.txt 
this is tab     finish.
this is several space       finish.
[root@localhost tmp]# sed -n l tab_space.txt  ### -n  l是L的小写字母
this is\ttab\tfinish.$
this is several space       finish.$
posted @ 2019-10-24 00:01  Noob52037  阅读(233)  评论(0编辑  收藏  举报