bash shell学习-正则表达式基础 (笔记)
2015-06-27 15:17
579 查看
A gentleman is open-minded and optimistic; a small person is narrow-minded and pessimistic.
"君子坦荡荡,小人长戚戚"
参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)
一、正则表达式基础
1、什么是正则表达式
正则表达式(Regular Expression, RE)是对字符串操作的一种逻辑公式,就是用一些事先定义好的特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
2、为什么要学习正则表达式
由于其强大的字符串处理能力,目前许多工具和编程语言都支持正则表达式,熟练掌握它可以帮助我们更高效的完成工作
3、语系对正则表达式的影响
由于不同的语系其编码顺序不一样,导致正则表达式的匹配结果可能不一样,所以在使用之前应该先确认当前的语系,也可以使用下面这些特殊符号来避免不同语系带来的问题:
4、基础正则表达式字符
5、扩展正则表达式
扩展正则表达式可以通过组合功能,将多次查找变为一次查找,使用 grep -E 或者 egrep 来支持扩展正则表达式
6、扩展正则表达式字符与范例
二、使用正则表达式的工具
1、sed工具
sed是一种以行为单位,对数据进行替换、删除、新增、选取特定行等操作的工具,同时也支持管道
范例:
推荐阅读:sed简明教程
2、awk工具
awk是一种优良的文本处理工具,支持正则表达式和管道,经常用于将一行分成数个‘字段’来处理
处理流程:
①读入第一行,并将第一行的数据填入$0,$1,...等变量当中;
②依据条件类型的限制,判断是否要进行后面的动作;
③做完所有动作与条件类型;
④重复①~③,直到处理完所有数据;
范例:
假设有一个文件名为pay.txt,内容如下:
如果我要计算每一个人的总额,并且按照一定的格式打印出来,那么可以这样:
其中的printf的用法和C语言中的差不多,输出的结果类似这样:
推荐阅读:AWK 简明教程
三、其他工具
1、文件比较工具: diff、cmp、patch
2、文件打印准备: pr
总结:正则表达式真的是一种非常有用的工具,由简单的规则可以搭配出复杂的字符串,不过伴随着高效率的往往是高难度,需要以后不断的使用才能逐渐掌握
"君子坦荡荡,小人长戚戚"
参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)
一、正则表达式基础
1、什么是正则表达式
正则表达式(Regular Expression, RE)是对字符串操作的一种逻辑公式,就是用一些事先定义好的特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
2、为什么要学习正则表达式
由于其强大的字符串处理能力,目前许多工具和编程语言都支持正则表达式,熟练掌握它可以帮助我们更高效的完成工作
3、语系对正则表达式的影响
由于不同的语系其编码顺序不一样,导致正则表达式的匹配结果可能不一样,所以在使用之前应该先确认当前的语系,也可以使用下面这些特殊符号来避免不同语系带来的问题:
特殊符号 | 代表意义 |
[:alnum:] | 英文大小写字母及数字,即0-9,A-Z,a-z |
[:alpha:] | 英文大小写字母,A-Z,a-z |
[:blank:] | 空格与Tab |
[:cntrl:] | 控制按键,CR,LF,Tab,Del等 |
[:digit:] | 数字,0-9 |
[:graph:] | 除了空格和Tab外的所有按键 |
[:lower:] | 小写字母,a-z |
[:print:] | 可被打印出来的字符 |
[:punct:] | 标点符号,即 ",',?,!,;,:,#,$ |
[:upper:] | 大写字母,A-Z |
[:space:] | 任何会产生空白的字符,包括空格键[Tab] CR等 |
[:xdigit:] | 十六进制的数字类型,包括0-9,A-F,a-f |
RE字符 | 意义与范例 |
^word | 意义:以word开头 范例:查找以'#'开头的那一行 grep -n '^#' filename |
word$ | 意义:以word结尾 范例:查找以'!'结尾的那一行 grep -n '!$' filename |
. | 意义:代表一定有一个任意字符的字符 范例:查找包含字符'a'并且'a'后面至少有一个字符的那一行 grep -n 'a.' filename |
\ | 意义:转义字符,将特殊符号的特殊意义去除 范例:查找包含单引号的那一行 grep -n \' filename |
* | 意义:重复零到无穷多个的前一个字符 范例:查找包含(es)(ess)(esss)等字符串所在的行 grep -n 'ess*' filename |
[list] | 意义:list中的任意一个字符都可以被匹配 范例:查找包含'get'或者'got'的行 grep -n 'g[eo]t' filename |
[n1-n2] | 意义:n1-n2范围内的任意一个字符都可以被匹配 范例:查找包含数字的那一行 grep -n '[0-9]' filename |
[^list] | 意义:不包含在list中的其他任意一个字符 范例:查找不包含大写字母的那一行 grep -n '[^A-Z]' filename |
\{n,m\} | 意义:连续n到m个的前一个字符,若为\{n\}则是连续n个前一个字符, \{n,\}为连续n到无穷多个前一个字符 范例:查找包含'goog'或者'gooog'的那一行 grep -n 'go\{2,3\}g' filename |
扩展正则表达式可以通过组合功能,将多次查找变为一次查找,使用 grep -E 或者 egrep 来支持扩展正则表达式
6、扩展正则表达式字符与范例
RE字符 | 意义与范例 |
+ | 意义:重复一个或一个以上的前一个RE字符 范例:查找(god)(good)(goood)等的字符串 egrep -n 'go+d' filename |
? | 意义:零个或一个的前一个RE字符 范例:查找(gd)(god)这两个字符串 egrep -n 'go?d' filename |
| | 意义:用‘或’的方式找出满足不同条件的字符串 范例:查找包含'gd'或'good'或'dog'的字符串 egrep -n 'gd|good|dog' filename |
() | 意义:找出‘组’字符串 范例:查找包含(glad)或(good)的字符串 egrep -n 'g(la|oo)d' filename |
()+ | 意义:多个重复组的判别 范例:查找'A'开头'C'结尾,并且'A'和'C'之间包含一个以上的'xyz'的字符串 egrep -n 'A(xyz)+C' filename |
1、sed工具
sed是一种以行为单位,对数据进行替换、删除、新增、选取特定行等操作的工具,同时也支持管道
用法:sed [-nefr] [动作] 参数说明: -n :使用安静模式,加上-n使得只有经过sed处理的那一行才会被显示出来 -e :直接在命令行模式上进行sed的动作编辑 -f :直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作 -r :sed的动作支持的是扩展正则表达式的语法(默认为基础正则表达式语法) -i :直接修改读取的文件的内容,而不是由屏幕输出 动作说明: [n1[,n2]] function n1, n2 :一般代表选择进行动作的行数,不一定存在 funciton有下面这些参数: a :新增,a后面可接字符串,这些字符串会在新的一行出现(当前行的下一行) c :替换,c后面可接字符串,这些字符串可以替换n1, n2之间的行 d :删除,后面通常不接参数 i :插入,后接字符串,这些字符串将会出现在新的一行(当前行的上一行) p :打印,将某个选择的数据打印出来,通常 p 会与 sed -n 一起运行 s :替换,可以直接进行替换,通常配合正则表达式使用
范例:
①以行为单位的新增/删除: $ sed '2,5d' filename #删除第2~5行 $ sed '2a hello world' filename #在第二行后面新增一行,内容为“hello world” ②以行为单位的替换与显示: $ sed '2,5c No 2-5 number' filename #将第2~5行替换为新的一行,内容为‘No 2-5 number’ $ sed -n '2,5p' filename #打印第2~5行,如果不加-n则会把所有数据都输出一遍 ③部分数据的查找并替换:sed 's/old/new/g' filename #将'old'替换为'new' $ sed 's/#.*$//g' #删除注释 $ sed '/^$/d' #删除空行 ④直接修改文件内容:加上-i参数可以直接修改文件内容(利用这个功能可以在代码文件中将多行代码注释掉)
推荐阅读:sed简明教程
2、awk工具
awk是一种优良的文本处理工具,支持正则表达式和管道,经常用于将一行分成数个‘字段’来处理
用法:awk '条件类型1{动作1} 条件类型2{动作2} ...' filename #字段分隔符默认为空格或[tab]键
处理流程:
①读入第一行,并将第一行的数据填入$0,$1,...等变量当中;
②依据条件类型的限制,判断是否要进行后面的动作;
③做完所有动作与条件类型;
④重复①~③,直到处理完所有数据;
#字段的变量名称:$0表示整一行,$1代表第一个字段,以此类推 #内置变量:NF(每一行拥有的字段总数)、NR(当前处理的行是第几行)、FS(目前的分隔符) #逻辑运算符:>、<、>=、<=、==、!= #关键字:BEGIN、END #语法: BEGIN{这里面放的是执行前的语句} # END{这里面放的是处理完所有行后要执行的语句} # {这里面放的是处理每一行要执行的语句}
范例:
假设有一个文件名为pay.txt,内容如下:
# Name 1st 2nd 3th # VBird 23000 24000 25000 # DMTsai 21000 20000 23000 # Bird2 43000 42000 41000
如果我要计算每一个人的总额,并且按照一定的格式打印出来,那么可以这样:
$ cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n", $1, $2, $3, $4, "Total" } > NR>=2{total = $2 + $3 + $4 > printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
其中的printf的用法和C语言中的差不多,输出的结果类似这样:
# Name 1st 2nd 3th Total # VBird 23000 24000 25000 72000.00 # DMTsai 21000 20000 23000 64000.00 # Bird2 43000 42000 41000 126000.00
推荐阅读:AWK 简明教程
三、其他工具
1、文件比较工具: diff、cmp、patch
# diff:通常用于同一文件的新旧版本区别上,以行为单位比较 #用法:diff [-bBi] from-file tofile #比较from-file和to-file并输出不同的地方 # cmp:以‘字节’为单位比较 #用法:cmp [-s] file1 file2 #按字节比较file1和file2,并输出发现的第一个不同点,加上-s输出所有不同点 # patch:与 diff 配合制作补丁文件和升级文件 #用法: $ diff -Naur oldfile newfile > patch_file #通过比较新旧文件制作补丁文件,patch_file通常以.patch为后缀 $ patch -pN < patch_file #更新旧文件,N表示取消几层目录 $ patch -R -pN < patch_file #还原为原来的文件
2、文件打印准备: pr
# pr:为要打印的文件设置标题和页码 #用法:pr filename #为filename的输出加上文件时间、文件名称和页码
总结:正则表达式真的是一种非常有用的工具,由简单的规则可以搭配出复杂的字符串,不过伴随着高效率的往往是高难度,需要以后不断的使用才能逐渐掌握
相关文章推荐
- CURL Shell下curl的使用
- PowerShell脚本反引号用法实例:随时随地给代码换行
- shell脚本
- shell脚本编写存储过程(mysql)
- Bash脚本中的操作符
- Linux Shell 常用技巧
- Shell脚本[运算表达式,条件控制语句]
- Qt在xxx.pro文件中执行shell命令
- shell脚本基础知识(下)
- 【shell脚本】mysql每日备份shell脚本
- 【shell脚本】mysql每日备份shell脚本
- bashrc与profile的区别
- 使用popen()执行shell命令并获取内容
- Xshell常用配置
- /etc/profile、~/.bash_profile等几个文件的执行过程
- 【每天一个linux命令】11. Linux配置环境变量/etc/profile .bashrc .bash_profile等
- profile与bashrc
- profile与bashrc 分类: Ubuntu学习笔记 2015-06-26 14:42 146人阅读 评论(0) 收藏
- shell expect
- 认识 BASH 这个 Shell