shell脚本应用(四)
1.正则表达式的定义
正则表达式又称正规表达式.常规表达式。在代码中常简写为regex,regexp或E。正则表达式
是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串
的方法,通过一些特殊符号,实现快速查找、删除.替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一
个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配,其中
普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中
具有特殊意义的专用字符,可以用来规定其前导字符〈即位于元字符前面的字符)在目标对象中
的出现模式。
正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表
达式,如前面提到的Perl、Linux系统中常见的文本处理器(grep、egrep, sed、awk),正则表达式具
备很强大的文本匹配功能.能够在文本海洋中快速高效地处理文本。
2.正则表达式用途
对于一般计算机用户来说,由于使用到正则表达式的机会不多,所以无法体会正则表达式的魅
力,而对于系统管理员来说,正则表达式则是必备技能之一。
正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息
有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法
快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达
式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。
目前很多软件也支持正则表达式,最常见的就是邮件服务器。在Internet中,垃圾/广告邮件经
常会造成网络塞车,如果在服务器端就将这些问题邮件提前剔除的话,客户端就会减少很多不必要
的带宽消耗。而目前常用的邮件服务器postfix以及支持邮件服务器的相关分析软件都支持正则表达
式的比对功能。将来信的标题和内容与特殊字符串进行对比,发现问题邮件就过滤掉。
除邮件服务器之外.很多服务器软件都支持正则表达式。虽然这些软件都支持正则表达式,不
过字符串的对比规则还需要系统管理员来添加,所以作为系统管理员,正则表达式是必须掌握的技
能之一。
正则表达式的组成
普通字符串
大写字母A-Z
小写字母a-z
符号
元字符
正则表达式常见的选项
-n | 显示行号 |
---|---|
-o | 显示匹配内容 |
-i | 不区分大小写 |
-vn | 取反 |
正则表达式常见的元字符
^ | 起始内容 |
---|---|
$ | 结束内容 |
. | 匹配任意单个字符 |
[] | 匹配括号中的内容 |
[-] | 匹配括号里边内容的范围 |
{n} | 匹配范围的次数 |
{n1-n2} | 匹配开始和结束内容 |
[^] | 匹配括号之外的任意字符 |
\ | 转义字符 |
grep的运用正则表达式
查看起始内容为A和a的
[root@centos01 ~]# grep ‘^ [A|a]’ test.txt
查看开头为w中间任意字符结尾是d的
[root@centos01 ~]# grep ‘w…d’ test.txt
转义符的使用,匹配范围的使用匹配次数的使用
[root@centos01 ~]# grep -n -E ‘[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}’ test.txt
扩展正则表达式常见的选项
+ | 重复一个或者一个以上的前一个字符 |
---|---|
? | 显示当前字母前的一个字符 |
| | 或者,多出多个字符 |
() | 查找组字符串 |
()+ | 多个重复的组 |
egrep扩展正则的使用
+的使用
[root@centos01 ~]# egrep ‘wo+d’ test.txt
?的使用
[root@centos01 ~]# egrep ‘?dn’ test.txt
|的使用
[root@centos01 ~]# egrep ‘linux|Linux’ test.txt
()的使用
[root@centos01 ~]# egrep ‘(w|A|a)’ test.txt
()+的使用
[root@centos01 ~]# egrep ‘A(xyz)+C’ test.txt
sed的使用
sed命令常见的选项
-n | 显示处理后的结果 |
---|---|
-h | 显示帮助 |
-e | 指定使用脚本或者命令处理文本数据 |
-f | 指定脚本处理输入的文本数据 |
-i | 直接编辑文本文件 |
sed常见的操作符
a | 添加内容 |
---|---|
d | 删除内容 |
p | 打印内容 |
s | 替换内容 |
y | 字符转换 |
c | 将指定行替换成指定内容 |
显示1-5行的数据
[root@centos01 ~]# sed -n ‘1,5p’ test.txt
删除第N行数据
[root@centos01 ~]# sed -i ‘1d’ test.txt
将大写改为小写
[root@centos01 ~]# sed -i ‘s/A/a/’ test.txt
删除空行
[root@centos01 ~]# cat test.txt
awk的使用
awk的变量
FS | 文本字段分隔符,可以使用空格作为占位符 |
---|---|
NF | 处理行数 |
NR | 处理数据的行号 |
$0 | 处理整行数据 |
$n | 处理数据行的第几列数据 |
显示第一列数据
[root@centos01 ~]# awk "{print $1}’ 1.txt
显示第一列和第二列数据
[root@centos01 ~]# awk '{print $1,$2}'1.txt
显示第一列和第二列数据使用–号分割
[root@centos01 ~]# awk ‘{print $1"----"$2}’ 1.txt
过滤/etc/passwd的第7列数据
[root@centos01 ~]# awk -F ‘:’ {‘print $7’} /etc/passwd | wc -l
实验
配置本地 YUM源,方便后期软件安装。
锁定关键的系统文件,如/etc/passwd、/etc/shadow、/etc/group,/etc/gshadow等文件。
清空/etc/ issue,去除系统及内核版本登录前的屏幕显示。
定时清理/var /spool/clientmqueue/目录下的垃圾文件.防止lnodes节点被占满。
关闭selinux并设置系统语言编码为utf—8.
#!/bin/bash
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow
echo "" > /etc/issue
rm -rf /var/spool/clientmqueue/
sed -i 's/enforcing/disabled/g' /etc/selinux/config
sed -i 's/LANG="zh_CN\.UTF-8"/LANG="zh_CN\.UTF-8"/' /etc/locale.conf