微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用正则表达式写出高效率的GREP

正则表达式可追溯到科学家对人类神经系统工作原理的早期研究。是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

作用:

1. 给定的字符串是否符合正则表达式的匹配

2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

特点:

1. 灵活性、逻辑性和功能性非常的强;

2. 可以迅速地用极简单的方式达到字符串的复杂控制。

3. 对于刚接触的人来说,比较晦涩难懂。

正则表达式元字符使用方法

匹配的关键点:

字符匹配,匹配次数,位置锚定,特殊符号、分组\(\)与引用\#

字符匹配:

.: 配置任意单字符

[^]:取反,不包含,认是一个字符长度

[ ]:范围内的任意字符

POSIX字符类:

[:alnum:] 匹配字母和数字. 等价于A-Za-z0-9.

[:digit:] 匹配(十进制)数字. 等价于0-9.

[:alpha:] 匹配字母. 等价于A-Za-z.

[:lower:] 匹配小写字母. 等价于a-z.

[:upper:] 匹配大写字母. 等价于A-Z.

[:space:] 匹配空白字符(空格和水平制表符).

匹配次数:

. : 配置任意单字符

* : 任意长度,它前面的字符可以出现任意次

.* : 任意长度的任意字符

\? : 0次或1次,它前面的字符可有可无

\{m,n\}: 前面的字符至少出现m次,前面的字符至多出现n次

\{m\}: m次,前面的字符出现m次

\{m,\} : 前面的字符至少出现m次

\{0,n\}: 前面的字符至多出现n次

位置锚定:行和词

行:

^$:空白行
^:行首锚定
$:行尾锚定

单词:
\<,\b:单词词首锚定
\>,\b:单词词尾锚定

特殊符号:

\(\) :分组

| :或
  
\. :转意符

分组与引用

\(\) :分组

\# :引用第#个括号所匹配到的内容,而非模式本身


GREP是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。包括grep、egrep和fgrep

格式:grep [option]...'PATTERN' FILE...

grep命令选项

-i:--ignore-case 忽略大小写差别。

-v:--revert-match反选,只显示不匹配的行。

-o:仅显示匹配的字串,而非字符串所在的行

--color=auto:高亮显示

-E支持使用 扩展正则表达式

-A #显示匹配到的后#行

-B #显示匹配到的前#行

-C #显示匹配到的前后各#行

语法与释义:

基础语法"^([]{})([]{})([]{})$"
  正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束"

实例:

基本的正则表达式:

1显示/proc/meminfo文件中以大写或小写S开头的行;

# grep -i '^s' /proc/meminfo

# grep '^[Ss]' /proc/meminfo

# egrep '^(S|s)' /proc/meminfo

2显示/etc/passwd文件中其认shell为非/sbin/nologin的用户

# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

3显示/etc/passwd文件中其认shell为/bin/bash的用户中UID号最大的用户

# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n |tail -1 | cut -d: -f1

5显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# grep "^[[:space:]]\{0,1\}" /boot/grub/grub.conf

# grep "^[[:space:]]\?" /boot/grub/grub.conf

7、找出netstat-tan命令执行结果中以'LISTEN'结尾的行;

# netstat -tan | grep "LISTEN[[:space:]]*$"

8、找出当前系统上其用户名认shell相同的用户

# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd

扩展的正则表达式:

1、找出/etc/rc.d/init.d/functions文件中某单词后跟一个小括号“()”行;

# egrep -o "\<[[:alnum:]]+\>\(\)"/etc/rc.d/init.d/functions

2、使用echo命令输出一个路径,而后使用grep取出其基名;

#echo "/etc/sysconfig/" | egrep -o"[[:alnum:]]+/?"

# echo "/etc/sysconfig/" | egrep �o "[^/]+/?$"| cut -d/ -f1

3显示本机IP地址:

#ifconfig | egrep --color'(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>)'

如何写出高效率的正则表达式:

使用正则表达式语法对于目标文本进行描述和界定,可以像画素描一样,先大致勾勒出框架,再逐步在局步实现细节。

原文地址:https://www.jb51.cc/regex/361525.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐