linux中正则表达式使用

时间:2022-12-03 19:11:50

目录:

1、grep介绍
2、grep的使用
3、egrep的简单介绍
4、例子进行说明

1、grep介绍

    grep(Global search REgular expression and Print out the line )是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。

作用:根据用户指定的模式“(过滤条件)”对目标文本追行进行匹配检查,打印匹配到的行;

(1)正则表达式的引擎:

grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

常见选项:
--color=auto:自动对匹配到的文本着色后高亮显示;
-i ignore-case:忽略字符的带小写;
-o --only-match:仅显示匹配到的字符串本身;
-v,--invert-match:--invert-match:显示不能被模式匹配的行;
-E,--extended-regexp:支持使用扩展的正则表达式元字符;
-q,--qulet,--slient:静默模式,即不输出任何信息;
-A#,NUM, --after-context=NUM:显示搜索字符串的后#行;
-B#,NUM, --before-context=NUM:显示搜索字符串的前#行;
-C#,NUM, -NUM, --context=NUM:显示搜索字符创的前后各#行;
-w,--word-regexp:匹配整个单词;
-F:相当于fgrep,不支持正则表达式;
-e:实现多个选项间的逻辑or关系;
-n:显示匹配到的行号;

(2)基本正则表达式的元字符:

① 字符匹配:

.:匹配任意单个字符;
[]:匹配指定范围内容的任意单个字符;
[^];匹配指定范围外的任意单个字符;
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

② 匹配次数:

*:匹配前一个字符任意次,如0次,1次…
.*:匹配前一个字符任意次;
\?:匹配前一个字符0次或1次;
+:匹配前一个字符1次或多次;
{n}:匹配前一个字符n次
{n,m}:匹配前一个字符n次到m次;
{n,}:匹配前一字符至少n次;
{0,m}:匹配前一个字符至多m次;

④分组及引用:

():将一个或多个字符捆绑在一起,当做一个整体进行处理;
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之内的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之内的模式所匹配到的字符;

注意:后向引用只是引用分组括号所匹配到的字符,而不是引用匹配的模式本身。

⑤或者:

|:匹配内容连接符;
示例: a|b:表示a或b。


示例:

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
[root@centos7 ~]#grep -i '^s' /proc/meminfo
[root@centos7 ~]#grep '^[sS]' /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
[root@centos7 ~]#grep -v '/bin/bash$' /etc/passwd
3、显示用户rpc默认的shell程序
[root@centos7 ~]#grep -w 'rpc' /etc/passwd
4、找出/etc/passwd中的两位或三位数
[root@centos7 ~]#grep -o '[0-9]\{2,3\}' /etc/passwd
[root@centos7 ~]#grep -o '[[:digit:]]\{2,3\}' /etc/passwd
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
[root@centos7 ~]#grep '^[[:space:]].*[^[:space:]]' /etc/grub2.cfg
6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
[root@centos7 ~]#netstat -tan |grep "LISTEN[[:space:]]*$"
7、显示CentOS7上所有系统用户的用户名和UID
[root@centos7 ~]#cut -d: -f1,3 /etc/passwd |grep '\<[[:digit:]]\{1,3\}$'
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行
[root@centos7 ~]#grep '\(^\<[[:alnum:]]\+\>\).*/\1$' /etc/passwd
[root@centos7 ~]#grep '\(^[[:alnum:]]\+\>\).*/\1$' /etc/passwd


2、egrep:支持扩张的正则表达式实现类似于文本过滤功能;


(1)egrep选项和grep类型,这里就不进行累述了,如果不理解请看grep常用选项的讲解;


(2)扩展正则表达式的元字符:

字符匹配:

. :任意单个字符;
[]:指定范围内的任意单个字符;
[^]:指定范围外的任意单个字符;

次数匹配

*:任意次,0,1或多次;
?:0次或1次;其前的字符是可有可无;
+:1次或多次;其前字符至少1次;
{m}:其前的字符m次;
{m,n}:至少m次,至多n次

位置锚定

^:行首锚定;
$:行尾锚定;
\<或\b:词首锚定
>或\b:词尾锚定;

分组及引用

():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
后向引用:\1 ,\2

a|b:a或者b;
egrep和grep区别主要是不用写转义符。


示例:

1、显示三个用户root、mage、wang的UID和默认shell
[root@centos7 ~]#egrep '^(root|mage|wang)\>' /etc/passwd |cut -d : -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
[root@centos7 ~]#grep -oE '^[[:alnum:]_]*\(' /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@centos7 ~]#echo /etc/rc.d/init.d/functions/ |egrep -o '[^/]?*/$'
4、使用egrep取出上面路径的目录名
[root@centos7 ~]#echo /etc/rc.d/init.d/functions/ |egrep -o '^/.*/\<'
5、统计last命令中以root登录的每个主机IP地址登录次数
[root@centos7 ~]#last |grep -E '^root\>' |grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'|sort |uniq -c
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
egrep '[0-9]'
egerp '[1-9][0-9]'
egrep '1[0-9][0-9]'
egrep '2[0-4][0-9]'
egrep '25[0-5]'

7、显示ifconfig命令结果中所有IPv4地址
[root@centos7 ~]#ifconfig |egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'
8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
[root@centos7 ~]#echo welcome to magedu linux |egrep -o '[[:alpha:]]' |sort|uniq -c|sort -r