一、Linux文本查找命令
在说Linux正则表达式之前,有一点需要提前说明,在Linux下查找文本文件常用的有三个命令:
1.grep:最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。
2.egrep:扩展grep,其使用扩展正则表达式(ERE)来匹配文件。
3.fgrep:快速grep,这个版本匹配固定字符串而非正则表达式,是唯一可以并行匹配多个字符串的版本。
需要说明的是,在最新的版本中egrep和fgreo都不能再直接使用,使用grep -E和grep -F替换。
使用grep --help可以查询grep的详细信息:
正则表达式选择与解释: -E, --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE) -F, --fixed-strings PATTERN 是一组由断行符分隔的定长字符串。 -G, --basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE) -P, --perl-regexp PATTERN 是一个 Perl 正则表达式 -e, --regexp=PATTERN 用 PATTERN 来进行匹配操作 -f, --file=FILE 从 FILE 中取得 PATTERN -i, --ignore-case 忽略大小写 -w, --word-regexp 强制 PATTERN 仅完全匹配字词 -x, --line-regexp 强制 PATTERN 仅完全匹配一行 -z, --null-data 一个 0 字节的数据行,但不是空行 Miscellaneous(其它的选项): -s, --no-messages suppress error messages消除错误信息 -v, --invert-match select non-matching lines选择非匹配的行,也就是取反 -V, --version display version information and exit版本信息 --help display this help text and exit 输出控制: -m, --max-count=NUM NUM 次匹配后停止 -b, --byte-offset 输出的同时打印字节偏移 -n, --line-number 输出的同时打印行号 --line-buffered 每行输出清空 -H, --with-filename 为每一匹配项打印文件名 -h, --no-filename 输出时不显示文件名前缀 --label=LABEL 将LABEL 作为标准输入文件名前缀 -o, --only-matching show only the part of a line matching PATTERN只显示部分结果 -q, --quiet, --silent suppress all normal output禁止所有正常输出 --binary-files=TYPE assume that binary files are TYPE;假设需要匹配的是二进制文件 TYPE is ‘binary‘, ‘text‘, or ‘without-match‘ -a, --text equivalent to --binary-files=text 等价于 二进制文件=文本 -I equivalent to --binary-files=without-match 等价于 二进制文件=没有匹配到的 -d, --directories=ACTION how to handle directories; 如何处理目录:读、递归、跳过 ACTION is ‘read‘, ‘recurse‘, or ‘skip‘ -D, --devices=ACTION how to handle devices, FIFOs and sockets;如何处理设备、先入先出队列和套接字 ACTION is ‘read‘ or ‘skip‘读或者跳过 -r, --recursive like --directories=recurse 递归 -R, --dereference-recursive 引用递归 likewise, but follow all symlinks --include=FILE_PATTERN包含文件模式 search only files that match FILE_PATTERN 只查找文件 --exclude=FILE_PATTERN不包含文件模式 skip files and directories matching FILE_PATTERN --exclude-from=FILE skip files matching any file pattern from FILE --exclude-dir=PATTERN directories that match PATTERN will be skipped.匹配的目录将被跳过 -L, --files-without-match print only names of FILEs containing no match只打印不匹配的文件名 -l, --files-with-matches print only names of FILEs containing matches 打印匹配的文件名 -c, --count print only a count of matching lines per FILE 打印匹配到的每个文件的行数 -T, --initial-tab make tabs line up (if needed) 如果需要的话制表符对齐 -Z, --null print 0 byte after FILE name 文件名后面不打印文件 文件控制: -B, --before-context=NUM 打印以文本起始的NUM 行 -A, --after-context=NUM 打印以文本结尾的NUM 行 -C, --context=NUM 打印输出文本NUM 行 -NUM same as --context=NUM --group-separator=SEP use SEP as a group separator 使用sep作为分离器 --no-group-separator use empty string as a group separator --color[=WHEN], --colour[=WHEN] use markers to highlight the matching strings; WHEN is ‘always‘, ‘never‘, or ‘auto‘ -U, --binary do not strip CR characters at EOL (MSDOS/Windows) -u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS/Windows) ‘egrep’即‘grep -E’。‘fgrep’即‘grep -F’。 直接使用‘egrep’或是‘fgrep’均已不可行了。 若FILE 为 -,将读取标准输入。不带FILE,读取当前目录,除非命令行中指定了-r 选项。 如果少于两个FILE 参数,就要默认使用-h 参数。 如果有任意行被匹配,那退出状态为 0,否则为 1; 如果有错误产生,且未指定 -q 参数,那退出状态为 2。
二、正则表达式
1.正则表达式的组成
(1)一般字符:没有特殊意义的字符
(2)特殊字符(meta字符):元字符,在正则表达式中有特殊意义
2.元字符介绍
(1)BRE和ERE(grep -E)通用的meta字符
meta字符 | 功能 |
\ | 通常用于打开或关闭后续字符的特殊含义,如\(...\) |
. | 匹配任意单个字符(除NULL) |
* | 匹配前面的任何数目或没有的单个字符,例如.*匹配任意字符的任意长度 |
^ | 匹配以什么开头的字符 |
$ | 匹配以什么结尾的字符 |
[] | 匹配括号内的任意字符,使用连接符(-)表示范围,(^)表示取反 |
(2)BRE(grep)才能用的元字符
meta字符 | 功能 |
\{n,m\} | 区间表达式,匹配它前面的单个字符重现的次数,\{n\}重现n次,{\n,m}\重现n到m次 |
\(\) | 保留空间,可以将最多9个独立的子模式存储在单个模式中,将括号内的当作一个整体 |
\n | 重复在\(与\)方括号内第n个子模式至此点的模式 |
(3)ERE(grep -E)才能用的元字符
meta字符 | 功能 |
{n,m} | 进行次数限制,与BRE的\{n,m\}功能相同,并不是把某个字段查找出来 |
+ | 匹配前面的一个或多个 |
? | 匹配前面的一个或多个 |
| | 匹配|符号前面或后面的正则表达式,逻辑或 |
() | 匹配方括号括起来的正则表达式群 |
比较:
#{n,m}与{\n,m}\比较 [[email protected] tmp]# grep -E"e{1,3}" 2.txt qweoooewwooaaaaoaaaafaweee eeeababyyyyyyyyy eeeabababuuu [[email protected] tmp]# grep "e\{1,3\}" 2.txt qweoooewwooaaaaoaaaafaweee eeeababyyyyyyyyy eeeabababuuu
(4)字符集
标识字符集有如下方法:
[::alnum] : 数字字符 | [:digit:] : 数字字符 |
[:punct:] : 标点符号字符 | [:alpha:] : 字母字符 |
[:graph:] : 非空格字符 | [:space:] : 空格字符 |
[:blank:] : 空格与定位字符 | [:lower:] : 小写字母字符 |
[:upper:] : 大写字母字符 | [:cntrl:] : 控制字符 |
[:print:] : 可显示的字符 | [:xdigit:] : 16进制数字 |
三、实例
如下通过常用实例来学习BRE和ERE匹配,源文件url.txt内容如下:
www.baidu.com http://www.baidu.com https://www.baidu.com http://wwwbaiducom baidu.com baidu
1.url匹配
匹配以http或者https开头,并且其后为:并且含有.的串
BRE匹配:
grep ‘^https\{0,1\}.*\..*‘ url.txt
ERE匹配:
grep -E ‘^https?.*\..*‘ url.txt
匹配结果如下:
http://www.baidu.com https://www.baidu.com
2.Email匹配
示例文件内容为:
匹配以字母数字或者下划线开头的多个字符,其后有一个@之后有多个字母数字或者下划线,其中有一个.号
grep ‘^[[:alpha:][:digit:]_]*@[[:alpha:][:digit:]]*\..*‘ email.txt
匹配结果: