linux文本三剑客之sed编辑器

文本三剑客:grep sed awk ,都是针对文本内容按行来进行处理。
sed工具:类似于vim,是一个文本编辑器,但是sed是按行来编辑和处理。
sed的主要作用就是对文本内容进行增删改查。
sed可以支持正则表达式,也可以支持扩展正则表达式,但不是完全依赖正则表达式。
sed的工作原理:
包括三个过程:读取-------执行--------显示
读取过程:读取文本内容后,会把读取到的内容存放到一个临时的缓冲区(模式空间)
执行过程:在模式空间,根据读取的文本内容,按行执行,除非指定行号,否则会遍历所有行。依次执行,从上往下执行。
显示过程:执行完成之后,把执行结果打印,如果要改变生效,模式空间被修改的内容会写入到指定文件当中。如果只是操作,但是最终不写入文件,只展示结果,展示完成之后,模式空间的数据会立即删除。
面试题:
文件过大该怎么办?
方式一:split -l 按行来切割来处理
方式二:cat 文件名 | sed 处理 -----适用于中型文件,若大型文件,建议先进性split分割
sed的实际操作:
sed的格式:
sed -e ‘操作’ 文件1 -e ‘操作’文件2(若是只对一个文件进行操作,-e可以不加)
sed的常用选项:
-e:条件操作选项
-f:指定脚本文件来处理输入的文件内容。把命令写在脚本里,用脚本里的命令来处理第二个文件里面的内容。
-i:立即生效 慎用!!
-n:显示script处理之后的结果(禁止sed的默认输出)
操作符:(用 ’ ’引起来用)
s:替换 替换指定的字符
d:删除,删除指定的行
a:增加,在当前行的下面插入指定内容
i:增加,在指定行的上面插入指定的内容
c:替换,整行替换
y:替换,替换字符,但是替换前后的字符长度必须一致。
p:打印 (sed默认有输出)
r:使用扩展正则
sed的核心就是”改”,“删”,“增”。查功能没有grep强大。
sed查功能:

查看/etc/passwd
方式一:sed '' /etc/passwd
方式二:

sed打印指定行,寻址打印
sed -n ‘4p’ 文件名 #打印第四行
sed -n ‘$p’ 文件名 #直接打印最后一行
方式二:行号的范围区间打印

sed -n '1,3p' 文件名 #打印第一行到最第三行
sed -n '2,$p' 文件名 #打印第二行到最后一行
 sed -n '2p;$p' 文件名 :打印第二行到第最后一行
行号范围打印: ,到;

打印奇数行和偶数行:

sed -n 'n;p' 文件名 (n在前就是跳过第一行,n在后就是跳过第二行)

文本过滤模式:
第一:对包含指定字符串的内容进行打印:

sed -n ’/o/p‘ 文件名
sed -n ’/big/p‘ 文件名 #将所有包含big的行,会全部打印出来

应用基础正则表达式进行打印:
sed -n ‘/^root/p’ /etc/passwd #打印以root为开头的行
sed -n ‘/bash$/p’ /etc/passwd #打印以bash为结尾的行
使用扩展正则表达式
sed -r -n

打印etc/passwd中99:99:的行:[root@localhost ~]# sed -r -n '/(99:){2}/p' /etc/passwd
sed -r -n '/^root|bash$/p' /etc/passwd #过滤出要么是root开头,要么是bash结尾的行。

面试题二:
怎么样不进入文件就可以删除文件当中的内容,也就是免交互删除。
方式一:sed -i ‘d’ 文件名
方式二:cat /dev/null >文件名

sed删除:
指定行号进行删除:
sed -n '3d;p’文件名 #删除第三行的内容,并打印剩余内容。
sed -n ‘1d;3d;p’ 文件名 #删除第一行和第三行的内容,并打印剩余内容。
sed -n ‘1d,3d;p’ 文件名 #删除第一行到第三行的内容,并打印剩余内容。
(,表示到;表示和)
sed ‘/big/d’ 文件名 #匹配字符串内容(big)进行删除
sed ‘/o/!d’ 文件名 #匹配字符串内容(o),除了o以外都进行删除
使用正则表达式进行删除:
sed ‘/^$/d’ 文件名 #删除空行

sed的替换(重点!!):
s 替换字符串:

 sed -n 's/root/test/p' /etc/passwd #把当前行的第一个root替换成test
 sed -n 's/root/test/gp' /etc/passwd #把当前行所有root替换成test
以root为开头的,把他的开头替换成#
```bash
 方式一:sed -n '/^root/ s/^/#/p' /etc/passwd
方式二:sed -n 's/^root/#root/gp' /etc/passwd
字母字符大小写进行替换:
l&:转换成小写的特殊符号,再使用时,需要转义符。
u&:转换成大小的特殊符号,在使用时,需要转义符
g:全部替换,如果不加,只替换首字母
                              sed 's/[a-z]/\u&/' 123.txt

``
c 整行替换:

sed '/要替换的行/c 需要替换的内容' 文件名

y单字符替换:
sed ‘y/’

增加:

a 在下一行添加:
sed '/指定行/a 添加的内容' 文件名
i 在上一行添加:
sed '/指定行/i 添加的内容' 文件名
r在行号读入指定文件的内容(在行后进行添加)sed '/原文件当前行下/r 要读取内容的文件 ' 指定操作的文件
例如:sed ‘/bighouse/r ky31.txt’ ky30.txt
sed命令当中字符串的位置进行交换:
 echo kyergedage | sed -r 's/(ky30)(erge)(dage)/\3\2\1/' #将dageergrky进行排序

面试题:笔试题
提取版本号:

[root@localhost test]# cat bbh.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/'
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5

查看指定时间内的日志:

sed -n '/Jul 20 18:36:12/,/Jul 20 18:50:01/p' /var/log/messages 

修改网卡的IP地址:

[root@localhost ~]# sed -i '/IPADDR=20.0.0.101/c IPADDR=10.10.10.10' /etc/sysconfig/network-scripts/ifcfg-ens33 
[root@localhost ~]# cat /etc/sysconfig/net
netconsole       network          network-scripts/ 
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=6f06e415-6e6b-4c35-bdc4-0f5e6c6279c3
DEVICE=ens33
ONBOOT=yes
IPADDR=10.10.10.10
NETMASK=255.255.255.0
GATEWAY=20.0.0.2
DNS1=218.2.135.1
DNS2=114.114.114.114

你可能感兴趣的:(linux,编辑器,运维)