sed命令使用详解
环境:centos7
使用sed-格式
命令行格式
sed [options] 'command' file(s)
option: -e;-n
command: 行定位 (正则)+sed命令(操作)
格式行格式举例
sed -n '/root/p'
sed -e '10,20p' -e 's/false/true/g'
基本操作命令
-p (打印相关的行)记住要和参数-n 配合
sed -n 'p' passwd
sed ---行定位
定位一行: x;行号 /pattern/ 正则
sed -n '10p' passwd
sed -n '/root/p' passwd
定位几行:
x,y; x行到y行
/pattern/,x; x y都可以用正则来表示
x,y! ;表示不取x到y的行即取反
nl passwd |sed -n '10,20p' #nl开启行号
nl passwd |sed -n '/operator/,/libstoragemgmt/p' # 打印从operator开始到libstoragemgmt结尾的行
nl passwd |sed -n '5,10!p' #打印5到10行以外的其他行
nl passwd |sed -n '10!p' #打印10行以外的其他行
定位间隔几行:firs~step
nl passwd |sed -n '2~3p' #表示第二行开始中间每间隔3行输出 (25812 的行)
sed---操作命令
基本操作命令(2)
-a (新增行) / i (插入行)
-c (替代行)
-d (删除行)
nl passwd |sed '2a ======' #在第2行后面添加=====的一行内容
[root@tmp]# nl passwd |sed '2a ======' 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
nl passwd |sed '2,5a ======' #在第2行到5行每行后面添加=====的一行内容
[root@tmp]# nl passwd |sed '2,5a ======' 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 ======
nl passwd |sed '2i ======' #在第5行前面插入=====的一行内容
[root@tmp]# nl passwd |sed '2i ======' 1 root:x:0:0:root:/root:/bin/bash ====== 2 bin:x:1:1:bin:/bin:/sbin/nologin
nl passwd |sed '2c ======' #将第二行替换成=====的一行内容
[root@tmp]# nl passwd |sed '2c ======' 1 root:x:0:0:root:/root:/bin/bash ====== 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
nl passwd |sed '1,2c ======' #将多行替换成=====的一行内容
[root@ tmp]# nl passwd |sed '1,2c ======' ====== 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
nl passwd |sed '1,2d' #删除1,2行
nl passwd |sed '/root/d' #删除带root的行
[root@tmp]# nl passwd |sed '/root/d' 2 bin:x:1:1:bin:/bin:/sbin/nologin [root@tmp]# nl passwd |sed '1,2d' 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
系统优化
sed '$a port 10022 \nallowrootlogin no' sshd_config.conf #表示在文件末尾添加两行
$表示文件末尾 \n 表示换行
[root@tmp]# sed '1i port 10022 \nallowrootlogin no' passwd #第一行前添加两行 port 10022 allowrootlogin no root:x:0:0:root:/root:/bin/bash
sed '$a \ port 10022 \n allowrootlogin no' sshd_config.conf #美化添加空格a后面需要转义空格
# ForceCommand cvs server port 10022 allowrootlogin no [root@tmp]# sed '$a \ port 10022 \n allowrootlogin no' /etc/ssh/sshd_config
sed '/^$/d' d.txt #删除空行 /^$/ 正则表达式空行
sed -n '/Error/p' log.txt #日志文件中查找错误行 正则匹配错误行
sed替换命令
-s:替换命令
-g:(全局) 替换所有的匹配字符
sed 's/false/true/' passwd
sed 's/false/true/g' passwd
sed获取服务器ip(思路:获取行,替换ip前后面内容)
[root@~]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.27.0.7 netmask 255.255.240.0 broadcast 172.27.15.255 inet6 fe80::5054:ff:fe3c:c92e prefixlen 64 scopeid 0x20<link> ether 52:54:00:3c:c9:2e txqueuelen 1000 (Ethernet) RX packets 1115181672 bytes 312544971311 (291.0 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1033162772 bytes 520647988228 (484.8 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@~]# ifconfig eth0|sed -n '/inet /p'|sed 's/inet//'|sed 's/netmask.*$//' 172.27.0.7
sed高级操作命令
-{ }:多个sed命令,用;分开
nl passwd|sed '{10,20d;s/faluse/true/g} #删除10到20行 并且替换faluse为true
-n: 读取下一个输入行(用下一个命令处理)sed是一行一行输入 -n表示下一行
和nl passwd|sed -n '1~2p' 跳行命令相似
[root@tmp]# nl passwd|sed -n '{n;p}' #第一行的下一行为第二行 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
-& :替换固定字符串 列子 sed 's/A/A12/' 改为使用固定字符串 sed 's/A/&12/'
#下面使用&处理passwd,将用户后面加两个空格 [root@tmp]# sed 's/^[a-z]\+/& /' passwd 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
案例一:大小写转换
将用户名的首字母转换为大小/小写字母
(元字符\u \l \U \L :转换为大写/小写字符)
[root@tmp]# sed 's/^[a-z]\+/\u&/' passwd #首字母大小 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
案例二: 将文件夹下的.txt 文件转换为大写
[root@SmartCommunity-Node01 tmp]# ls *.txt a_w.txt b.txt cal.txt d.txt #\W代表元字符[a-zA_Z_0-9] [root@SmartCommunity-Node01 tmp]# ls *.txt|sed 's/^\w\+/\U&/' A_W.txt B.txt CAL.txt D.txt
案例三:数据筛选
“获取passwd中user、uid和gid”
[root@tmp]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/USER:\1 UID:\2 GID\3/' passwd USER:root UID:0 GID0 USER:bin UID:1 GID1 USER:daemon UID:2 GID2 USER:adm UID:3 GID4
-\( \) :替换某种(部分)字符串(\1 ,\2)
s/w1w2w3/w2/ :w1w2w3 替换成w2
使用()改写 s/w1\(w2\)w3/\1/
案例:获取服务器ip
\([0-9.]\+\) 代表ip
[root@tmp]# ifconfig eth0|sed -n '/inet /p' inet 172.27.0.7 netmask 255.255.240.0 broadcast 172.27.15.255 [root@tmp]# ifconfig eth0|sed -n '/inet /p'|sed 's/inet \([0-9.]\+\).*$/\1/' 172.27.0.7
-r : 复制指定文件插入到匹配行
-w :复制匹配行拷贝指定文件里
源文件 <--互操作--> 目标文件
[root@tmp]# echo -e 'dfg\nabc' > f.txt [root@tmp]# more f.txt dfg abc [root@tmp]# echo -e '123\n456' >e.txt [root@tmp]# more e.txt 123 456
#将文件f.txt读入到e.txt的第一行后面
[root@tmp]# sed '1r f.txt' e.txt 123 dfg abc 456
w:写操作会改变写的文件(注意)
[root@tmp]# sed 'w f.txt' e.txt #将e文件内容写入f (f相当于e的mv) 123 456 [root@tmp]# more f.txt 123 456 [root@tmp]# sed '1w f.txt' e.txt #将e的第一行写入f (f就只有e的第一行内容) 123 456 [root@tmp]# more f.txt 123
-q: 退出sed
[root@tmp]# nl passwd |sed '/daemon/q' #读到daemon就退出 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
脚本格式
sed -f scriptfile file(s)