Linux处理文本文件的工具:
grep 过滤文件内容
sed 编辑文件内容
awk 打印文本的工具
正则表达式Regex
- 匹配单个字符的元字符
. :代表匹配任意单个字符
[abc] :匹配abc中的任意一个
[a-z] :匹配小写字母
[A-Z] :匹配大写字母
[0-9] :匹配数字
[a-zA-Z0-9] 匹配大写字母小写字母以及数字
[^a-z] 匹配除了小写字母以外的字符(数字或大写字母)
- 匹配字符出现的位置
^ 托字符
^str 以什么开头
str$ 以什么结尾
^$ 空行
- 匹配字符出现的次数
* 匹配0次或多次
? 匹配0个或1个
+ 匹配一个或多个
{3} 精确匹配3次
{2,5} 匹配2到5次
{2,} 至少匹配2次
4)匹配多个字符 用分组
(abc){2} 匹配2次
sed: Stream Editor 流编辑器
行编辑器 逐行编辑
将每行内容读入到内存中,在内存中进行处理,将结果返回给屏幕 ,此段内存空间称为模式空间
默认不编辑原文件,仅对模式空间的数据进行处理,处理结束后,将模式空间的内容显示到屏幕
sed命令的使用格式
sed [option] scripts file1 file2 ...
sed [option] 'AddressCommand' file1 file2 ...
Address:表示对哪些行进行处理
Command:操作命令
option选项:
-n:不再显示模式空间中的内容(默认显示)
-i: 直接修改原文件
-e 'AddressCommand' -e 'AddressCommand':同时执行多个匹配操作
[root@shell ~]# sed -e '/^#/d' -e '/^$/d' /etc/fstab
-f FILE 将多个AddressCommand保存至文件中,每行一个AddressCommand;读取该文件中的操作同时执行多个操作
[root@shell ~]# cat /tmp/1.txt
/^#/d
/^$/d
[root@shell ~]# sed -f /tmp/1.txt /etc/fstab
-r:表示使用扩展正则表达式
[root@shell ~]# sed -r 's|l(..e)|L1|' /tmp/1.txt
--follow-symlinks 修改软链接文件时
[root@shell ~]# sed --follow-symlinks -i 's|hello|hi|' /tmp/2.txt
Address表示方法:
1、StartLine,EndLine
1,100 对文件中的100 行经行操作
1,$ 对文件的第一行到最后1行
3,10 对文件的3到10行
2、LineNumber
3 对文件的第3行进行操作
$对最后一行经行操作
3、StartLine,+n
5,+2 对567经行操作
/root/,+2 找到root这一行,以及后2行
4、/正则表达式/,在sed中用正则表达式,固定格式/正则表达式/
/root/ 在文件中找到带有root的行
/bash$/ 以bash结尾的行
5、 /正则表达式1/, /正则表达式2/
第1次被Regex1匹配的行开始,到第1次被Regex2匹配的行中间的所有行
Command:
1:删除
删除符合条件的行
sed '1,2d' /etc/inittab
删除文件中包含oot的行
sed '/root/d' /etc/fstab
删除第1行及其后2行
sed '1,+2d' /etc/fstab
删除第1行
sed '1d' /etc/fstab
删除以/开头的行
sed '/^//d' /etc/fstab
追加
a string 在符合条件的行后追加新行,string为追加的内容
在以/开头的行后面追加# hello world
sed '/^//a #hello world' /etc/fstab
在以/开头的行后面追加两行内容,分别为# hello worl # hello linux
sed '/^//a # hello world
# hello linux' /etc/fstab
插入
i在指定的行插入
i string 在符合条件的行前添加新行,string为追加的内容
在文件第1行添加# hello world
sed '1i # hello world' /etc/fstab
替换(替换整行)
c string 替换指定行的内容
将文件中最后一行内容替换为End Of File
sed '$c End Of File' /1.txt
sed '7c SELINUX=disabled' /etc/sysconfig/selinux
替换 (替换的是某一部分)
c替换的是整行的内容,s 替换某1行的某一部分内容
s/regex/string/[修饰符] 查找并替换 默认情况下,只替换每一行第1次出现的字符
修饰符:
g:替换每一行所有的字符
i:忽略大小写
[root@localhost ~]# sed 's/^#/?/' /etc/fstab
查找文件中的UUID,并替换为uuid
sed 's/UUID/uuid/' /etc/fstab
将行首的/替换成#
sed 's/^//#/' /etc/fstab
[root@localhost ~]# sed 's|/|#|g' /etc/fstab
将每一行出现的所有/替换为@
sed 's///@/g' /etc/fstab
反向引用 () :其中代表转义
1 :代表引用正则表达式里面第一对圆括号里面的内容
2 :代表引用正则表达式里面第二对圆括号里面的内容
将文件中以l..e替换为l..er,例如love替换为lover
[root@localhost ~]# cat /tmp/1.txt
He like car
She love He
[root@localhost ~]# sed 's@(L..e)@1r@' /tmp/1.txt
He Liker car
She Lover He
&:引用正则表达式匹配的所有字符串
将文件中l..e的单词替换为L..e,例如love替换为Love
sed 's/l(..e)/L1/' /1.txt
sed示例1:
1、删除/etc/grub2.cfg文件中行首的空白字符
2、将/etc/fstab文件中的数字5替换为数字3
3、删除/etc/fstab文件中的空白行
4、删除/etc/inittab文件中开头的#号
5、删除某文件中开头的#号,但要求#号后面必须有空白字符
6、删除某文件中以空白字符后面跟#号的行中的开头的空白字符及
sed示例2:
系统初始化脚本:
1) 配置固定IP
2) 关闭SEinux及防火墙
3) yum源
4) 关闭SSH DNS解析及GSSAPI认证
5) 172.16.8.100同步时间
6) 设置主机名