Linux正则表达式

Posted 明王不动心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux正则表达式相关的知识,希望对你有一定的参考价值。

一、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

 匹配结果:

 

以上是关于Linux正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

python 正则表达式 re模块基础

python成长之路第三篇_正则表达式