目录
1.正则表达式
1.1 什么是正则表达式
正则表达式是处理字符串的方法,它是基于行来处理的行为,通过一些特殊符号的辅助,可以让使用者轻易地达到搜索/删除/替换某特定字符串的目的。
正则表达式是一种表示方法,工具程序支持这种表示方法,则可以使用正则表达式对字符串进行处理,如:vi、grep、sed、awk等
1.2 正则表达式的用途
主要进行日志分析、简单的垃圾邮件过滤、软件(系统)配置等。
1.3 正则表达式规范
正则表达式有不同的规范,POSIX规范,Perl规范,Python规范等,Shell中的grep、egrep都使用POSIX规范。
POSIX规范包括:
1.基本的正则表达式(Basic Regular Expression 简称BREs)
2.扩展的正则表达式(Extended Regular Expression 简称EREs)
2. 基本正则表达式
2.1 基本正则表达式常用字符
字符 | 含义 |
---|---|
\ | 忽略后面一个特殊符号的含义 |
^ | 匹配行首 |
$ | 匹配行尾 |
* | 匹配0到无穷多个任意字符 |
. | 匹配除换行符\n之外的任意单个字符 |
[str] | 对str中任意单个字符进行匹配 |
[^str] | 对任何不在str中的单个字符进行匹配 |
[a-b] | 对a-b之间的任意一个字符进行匹配,要写成递增 |
\{n,m\} | 匹配连续n到m个前一个字符 |
2.2 POSIX字符
POSIX字符类是一个形如[:…:]的特殊元序列(meta sequence),可用于匹配特定的字符范围。
2.2 grep用法
用于查找文件中包含有指定字符串的行
字符 | 含义 |
---|---|
-n | 显示行号 |
-o | 只显示匹配的内容 |
-q | 静默模式,没有任何输出,得用$?来判断执行结果有没有成功 |
-l | 只显示包含匹配模式的文件名 |
-v | 列出不匹配的行 |
-i | 对匹配模式不区分大小写 |
–color | 高亮颜色相似匹配到的字符串 |
-c | 对匹配的行进行计数 |
-i | 对匹配模式不区分大小写 |
2.3 grep 实验
例1 显示/etc/passwd中以bash结尾的行;
[root@bogon ~]# grep -n 'bash$' /etc/passwd
例2 查找/etc/man_db.conf中含有“以m开头,并以n结尾的单词”模式的行;
[root@bogon ~]# grep -n '\<m[a-Z]*n\>' /etc/man_db.conf
例3 显示/var/log/secure文件中包含“Failed”或“FAILED”的行
root@bogon ~]# grep -n "F(ailed|AILED)" /var/log/secure
例4 显示/etc/man_db.conf中,包含Linux绝对路径的行;
[root@bogon ~]# grep -n '/[[:alnum:]]*' /etc/man_db.conf
例5 提取ifconfig命令结果中的1-255之间的整数;
[root@bogon ~]# ifconfig|grep -oE "\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>"
例6 提取ifconfig结果中的合法ip地址(可结合sed工具)。
[root@bogon ~]# ifconfig | grep -w inet | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'
3. 扩展正则表达式
扩展正则表达式(Extend Regular Expression,ERE)支持比基本正则表达式
3.egrep用法
字符 | 含义 |
---|---|
+ | 对前一行进行 1次或多次匹配 |
? | 对前一项进行0次或1次重复匹配 |
{j} | 对前一项进行j次重复匹配 |
{j,} | 对前一项进行j次或更多次重复匹配 |
{,k} | 对前一项最多进行k次重复匹配 |
(a|b) | 匹配a或b中任意一项 |
() | 匹配表达式,创建一个用于匹配的子串 |
4.sed用法
主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转化程序等。
4.1 sed基本用法
字符 | 含义 |
---|---|
a | 新增,在目前的下一行新增字串 |
c | 覆盖,用指定字串覆盖指定行的内容 |
d | 删除,删除指定行 |
i | 插入,在指定行的前面插入 |
p | 打印,将摸个选择的数据打印出来,通常会与参数-n 一起运行 |
s | 替换,可以直接进行取代的工作 格式为 m,ns/old/new/g |
4.2 sed实验
已知example.txt文件内容如下
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
试编写sed命令实现如下功能:
(1) 删除$符号
[root@bogon ~]# nl example.txt | sed 's/\$//g' | sed -n 'p'
(2) 显示包含music文字的行内容及行号
[root@bogon ~]# cat example.txt |sed -n '/music/p'
(3) 只显示所有包含数字的行
[root@bogon ~]# cat example.txt | sed -n '/[0-9]/p'
(4) 只显示以“The”开头的行
[root@bogon ~]# cat example.txt |sed -n '/^The/p'
(5) 在第4行后面追加文件“hello world!”
[root@bogon ~]# nl example.txt |sed -e '4a hello world!'
(6) 将文本“The”修改为“Ok”
[root@bogon ~]# nl example.txt |sed -e 's/The/OK/g'
(7) 将第3行内容修改为“This is the third line.”
[root@bogon ~]# nl example.txt |sed -e "3c This is the third line"
(8) 删除第2行内容。
[root@bogon ~]# nl example.txt |sed -e "2d"
(9) 设置shell变量var的值为evening,用sed命令查找匹配var变量值的行。
[root@bogon ~]# var=evening
[root@bogon ~]# nl example.txt | sed -n "/$var/p"
注意是双引号,不能为单引号。
5.awk用法
5.1 awk基本用法
awk也是管道命令,sed通常处理一行数据,awk处理一行中的每个字段,默认以空格或tab键分隔
使用方法:
awk ‘条件类型1 {动作1} 条件类型2{动作2}···’’ filename
*条件类型和动作一定要用单引号括起来。
字符 | 含义 |
---|---|
$n | number,第几个字段 |
$0 | 当前整条记录 |
FS | Filed Separator,输入字段分隔符 |
RS | Recod Separator,输入记录分隔符 |
OFS | Output Filed Separator,输出字段分隔符 |
ORS | Output Record Separator,输出记录分隔符 |
NF | Number OF Fileds ,当前记录字段数 |
NR | Number OF Records,当前已处理的记录数 |
常用内置参数
- index(a,b) 返回b在a中的起始位置,若为字符串则用双引号引起来
- length(a) 返回a的长度
5.2 awk 实验
已知文件quote.txt内容如下:
one : two : three
four : five : six
(注:每个冒号前后都有空格)
试编写awk命令实现如下功能:分别以空格和冒号做分隔符,显示第2列的内容,观察两者的区别
[root@bogon ~]# awk 'BEGIN{FS=":"}{print $2}' quote.txt ;sed -n 'p' quote.txt
[root@bogon ~]# awk '{FS=":";print $2}' quote.txt
已知文件b.txt里面都是数字,且每行包含3个数字,数字之前以空格作为分隔符,试将b.txt里的所有偶数输出,并输出偶数的个数。要求:判断每行的3个数字是否为偶数时用循环结果,即要求程序里包含循环和分支结构。
例如:b.txt内容为:
2 4 3
15 46 79
则输出为:
2
4
46
3
[root@bogon ~]# awk '{for (i=1;i<NF;i++)if($i%2==0){print $i;sum++}}END{print "sum= "sum}' b.txt