一: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