正则表达式
语法 | 含义 | 举例 |
---|
. | 匹配任意一个字符 | abc. 可以匹配abcd,abc9等 |
[] | 匹配括号中的任意一个字符 | [abc]d可以匹配ad、bd或cd |
- | 在[]括号内表示字符范围 | [0-9a-fA-F]可以匹配以为十六进制数字 |
^ | 位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符 | [^xy]匹配除xy之外的任一字符,因此[^xy]1可以匹配a1,b1但不匹配x1,y1 |
[[:xxx:]] | grep工具预定义的一些命名字符类 | [[:alpha:]]匹配字母,[[:digit:]] 匹配一个数字 |
语法 | 含义 | 举例 |
---|
? | 紧跟在它前面的单元应匹配零次或一次 | [0-9]?.[0-9]匹配0.0,2.3 .5等,.由于正则表达式中是一个特殊字符,所以需要用转义字符\转义一下 |
+ | 紧跟在它前面的单元应匹配一次或多次 | [a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+.[a-zA-Z0-9_.-]+匹配email地址 |
* | 紧跟在它前面的单元应匹配零次或多次 | [0-9][0-9]*匹配至少一位数字,等价于[0-9]+,[a-zA-Z_]+[a-zA-Z_0-9]*匹配C语言的标识符 |
{N} | 紧跟在它前面的单元应精确匹配N次 | [1-9][0-9]{2}匹配从100到999整数 |
{N,} | 紧跟在它其前面的单元应匹配至少N次 | [1-9][0-9]{2,} 匹配三位以上(含三位)的整数 |
{,M} | 紧跟在它前面的单元应匹配至多M次 | [0-9]{,1}相当于[0-9]? |
{N,M} | 紧跟在它前面的单元应匹配至少N次,最多M次 | [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 匹配IP地址 |
//匹配test.regex中IP地址
egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' test.regex
- 再次注意grep找的是包含某一模式的行,而不是完全匹配某一模式的行。
- 位置限定符
语法 | 含义 | 举例 |
---|
^ | 匹配首行的位置 | ^Content匹配位于一行开头的Content |
$ | 匹配行末的位置 | ;$ 匹配位于一行的结尾的逗号,^$ 匹配空行 |
\< | 匹配单词开头的位置 | \<th 匹配 this,但不匹配 ethernet、 tenth |
\> | 匹配单词结尾的位置 | th\>匹配以th结尾的单词 |
\b | 匹配单词开头或结尾的位置 | \b放在开头匹配以xx开头,\b放结尾匹配以xx结尾,\bxx\b 只能匹配xx本身 |
\B | 匹配非单词开头和结尾的位置 | 即\Bxx 匹配非xx开头;xx\B匹配非xx结尾。 \Bat\B匹配battery,但不匹配 attend、hat… |
// 匹配IP地址的正则表达式简化为:
egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}$' test.regex
语法 | 含义 | 举例 |
---|
\ | 转义字符,普通的字符转义为特殊字符,特殊字符转义为普通字符 | 普通字符< 写成 < 表示以单词开头的位置,特殊字符 . 写成 . 以及 \ 写成 \ 来匹配 |
() | 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符 | ([0-9]{1,3}.){3}[0-9]{1,3}来匹配IP地址 |
| | 连接两个子表达式,表示或的关系 | n(o|either)匹配no或者neither |
Basic正则和Extended正则区别
以上介绍的是grep正则表达式的Extended规范,Basic规范也有这些语法,只是字符 ?+{}|() 应该解释为普通字符。要表示上述特殊含义的正则需要加 \ 转义。如果用grep而不是egrep,并且不加-E参数,则应该遵照Basic正则表达式。
- 如果使用Basic正则则上述匹配IP的正则应该改为:
//Basic正则
grep '^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}' test.regex
// Extend正则
grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}' test.regex
egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}' test.regex
grep命令
- grep [option]
- -c : 只输出匹配行的计数
- -i : 不区分大小写
- -h : 查询多文件时不显示文件名
- -l : 查询多文件时只输出包含匹配字符的文件名
- -n : 显示匹配行及行号
- -s : 不显示不存或无匹配文本的错误信息
- -v : 显示不包含匹配文本的所有行
- –color=auto : 可以将找到的关键词部分加上颜色的显示
- pattern正则表达上的重要参数
- \ : 忽略正则表达式中的特殊字符的原有含义
- ^ : 匹配正则表达式的开始行
- $ : 匹配正则表达式的结束行
- <:从匹配正则表达式的行开始
- >:到匹配正则表达式的行结束
- [ ]:单个字符,如[A]即A符合要求
- . : 所有的单个字符
-
- grep使用的简单实例
//查找并显示所有d开头的文件中包含的test的行
grep 'test' d*
//在dTest dTest1中查找并显示包含test的行
grep 'test' dTest dTest1
//在dTest1中查找并显示至少包含5个连续小写字符的字符串的行
grep '[a-z]\{5\}' dTest1
- grep -r : 明确要求搜索子目录
- grep -d skip : 忽略子目录
// 很多输出,通过管道将其转到“less” 上阅读
grep magic /usr/src/Linux/Documentation/* | less
// 当前目录下及其子目录下搜寻包含 192.168.175.129 串的文件 后面加 -n 可显示行号
grep -r 192.168.175.129 ./ // 执行结果如下:
./test.regex:192.168.175.129 hadoop01
./test.regex:hadoopǰ̨·Ďʵٖ·£ºhttp://192.168.175.129:50070
find命令
- -name:按照文件名查找文件 find /目录位置 参数 “匹配项” 如: find ./ -name “init”
- -size:按照文件大小查找
find ./ -size +3M -size -7M
find ./ -size +20k -size -80k
find ./ -size +200 -size -500 (单位为512B,扇区大小0.5K)
- type:按照文件的类型进行搜索,-d/-f/-p/-l/-s/-c/-b 如:find ./ -type f
- maxdepth:指针搜索的层级 find ./ -maxdepth 1 -type f :在当前目录下查找所有文件
- exec:对find查找结果执行某一命令,如:find ./ -maxdepth 1 -type f -exec ls -l {} ; 对find的结果执行ls -l命令。
- ok:与exec相似,会执行动作之前会询问是否执行,交互版的exec,如:
[leyou@localhostCentOS6 test]$ find ./ -maxdepth 1 -type d -ok rm -rf {} \;
< rm ... ./ > ? n
< rm ... ./d4 > ? n
< rm ... ./d3 > ? n
< rm ... ./d5 > ? n
< rm ... ./d1 > ? y
< rm ... ./d2 > ? y
//其中d1 d2文件夹被删除,而d3,d4,d5保留
- xargs : 通过管道将find的结果传给后面的命令执行,与exec区别在与,xargs会分批次进行处理,不容易造成内存泄露,用法:
find ./ -maxdepth 1 -type d | xargs ls -ldh
//当某个文件夹下有 “test test.c”文件时,执行xargs 会出现报错的现象,即xargs 传递的参数是以空格区分的,而“test test.c”刚好包含空格,即认为是两个文件。
[leyou@localhostCentOS6 d3]$ find ./ -type f | xargs ls -lh
ls: 无法访问./test: 没有那个文件或目录
ls: 无法访问test.c: 没有那个文件或目录
// 使用exec命令执行正常
[leyou@localhostCentOS6 d3]$ find ./ -type f -exec ls -lh {} \;
-rw-rw-r--. 1 leyou leyou 0 10月 19 21:33 ./test test.c
//如果用xargs 需要指定find搜索结果的结束标记,并在xargs传参时指定该结束标记
[leyou@localhostCentOS6 d3]$ find ./ -type f -print0 | xargs -0 ls -lh
-rw-rw-r--. 1 leyou leyou 0 10月 19 21:33 ./test test.c
- -atime/ctime/mtime:天为单位 -amin/cmin/mmin:分钟为单位
// 超找5天外文件内容被修改以syslog开头的文件名的信息
find ./ -name "syslog*" -mtime +5 -exec ls -l {} \;