文本三剑客: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