Linux三剑客之sed命令
Linux三剑客之sed命令
sed(流式编辑器):主要是用来修改文件的
#1、sed命令
sed [参数] "[定位][指令]" 处理的文本路径
注:不指定定位,则默认处理全文
-e :允许多项编辑
-n :取消默认输出(只打印指定的文本)
-i :就地编辑文本(执行写入文本)
-r :支持扩展正则表达式(sed中的命令必须放在\ \之间)
-f :指定定位规则的文件(就是把规则写在文本中,一次可进行多个编辑,是-e的扩展)
p : 打印文本
d :删除文本
si
案例说明:
-e的用法
1、在文本中,打印第1行和第5行(会连同原文件一起打印)
[root@localhost ~]# sed -n -e "1p" -e "5p" 1.txt
-n的用法
2、在文本中,要求只打印第1,5,6三行
[root@localhost ~]# sed -n -e '5p' -e "1p" -e "6p" 1.txt
3、要求删除文件的第3行
[root@localhost ~]# sed -i '3d' 1.txt
4、删除/etc/fstab文件中所有的注释的行
[root@localhost ~]# sed -i -r "/^ *#|^$/d" /etc/fstab
5、删除1.txt的3行,打印第4行
[root@localhost ~]# sed -f 3.txt 1.txt
[root@localhost ~]# cat 3.txt
练习1:要求将/etc/passwd文件复制到/root/1.txt中,然后删除当中包含/sbin/nologin的行
sed -i -r "\c/sbin/nologincd" /root/1.txt
练习2:将/etc/nginx/nginx.conf文件中所有的注释的行(以#开头的行)全部删除
sed -r -i "/^ *#|^$/" /etc/nginx/nginx.conf
#2、sed + 正则表达式(定位)
固定定位:sed -n "3p" 1.txt (打印第三行)
范围定位:sed -n "1,3p" 1.txt (打印1-3行)
正则表达式必须放在//之间
1、打印/etc/passwd文件中包含root的行
[root@localhost ~]# sed -n "/root/p" /etc/passwd
2、将包含空格的行打印出来
[root@localhost ~]# sed -n "/ +/p" /etc/passwd
3、数字加正则(非贪婪性的匹配)
1、在/etc/passwd文件中的第一行,到包含test的行,全部删除
[root@localhost ~]# sed -n -r "1,/test/d" /etc/passwd
2、删除从包含root的行到第5行的内容
[root@localhost ~]# sed -r "/root/,5d" /etc/passwd
3、从包含root的行删除到包含ftp的行
[root@localhost ~]# sed -r "/root/,/ftp/d" /etc/passwd
#正则匹配在特定情况下是非贪婪性的匹配
贪婪性是匹配到了之后,不停继续匹配,直至文件所有的内容全部匹配完毕
非贪婪性匹配,一旦匹配到了就停止匹配
4、\c与c分隔符(用于多个转义)
#注:\c与c只是一个代表,其中c可以换成任意一个字符
[root@localhost ~]# sed -i -r "\#/sbin/nologin#d" 4.txt
[root@localhost ~]# sed -i -r "\A/sbin/nologinAd" 4.txt
#3、sed的常用指令
p : 打印
d : 删除
a : 在当前行后添加一行或多行内容(多行可用换行符/n分开)
[root@localhost ~]# sed "2a xxxxxx" 4.txt
[root@localhost ~]# sed "2a xxxxxx/nxxxx" 4.txt
c : 用新文件修改(替换)当前行中的文本
[root@localhost ~]# sed "3c fbsdfbsdbfdsbfdsbfdsfbdsfbdsjfbsdu" 4.txt
y :将字符转换成一个新的字符(字符是1对1的关系)
[root@localhost ~]# sed "1,5y/sbin/1234/" /etc/passwd
sbin ---> 1234
s ---> 1
b ---> 2
i ---> 3
n ---> 4
s : 用一个字符把整体替换成另外一个字符
[root@localhost ~]# sed "s/sbin/1234/" /etc/passwd
#注:s指令替换对于行来说,是非贪婪性,它匹配到一个值后就不会再匹配,如果需要全局替换则需要使用 g 指令
g : 全局执行
[root@localhost ~]# sed "s/root/1234/g" /etc/passwd
i : 在当前行之前插入文本(-i表示立刻执行,不同场景表示意思不同)
[root@localhost ~]# sed "3i fbsdfbsdbfdsbfdsbfdsfbdsfbdsjfbsdu" 4.txt
i : 配合s指令配合一起使用时,则是忽略大小的作用
[root@localhost ~]# sed "s/ROOT/1234/i" /etc/passwd
忽略大小写全局替换(加g同样适用)
[root@localhost ~]# sed "s/ROOT/1234/ig" /etc/passwd
练习1 : 在/etc/passwd文件中1到3行之前插入HelloWorld
[root@localhost ~]# sed "1,3i HelloWorld" /etc/passwd
r :从以外文件中读相关内容,写到相关行之后
[root@localhost ~]# sed "1,3r 5.txt" /etc/passwd
把5.txt中的内容,写到/etc/passwd中1-3行下面(每一行下面都添加)
w : 匹配到的行写入一个新的文件之中
[root@localhost ~]# sed "1,5w 6.txt" /etc/passwd
练习1:替换/etc/passwd中的root为ROOT
[root@localhost ~]# sed -r "s/root/ROOT/g" /etc/passwd
练习2:将模板机(192.168.15.200)中的ip替换成192.168.15.50
[root@localhost ~]# sed "s/\.200/\.50/g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
练习3:删除/etc/passwd中的所有偶数行(奇数行1~2)
[root@localhost ~]# sed -i "2~2d" /etc/passwd
练习4:在每一行的行首增加#号
[root@localhost ~]# sed -r "s/^ */#/g" 1.txt