Linux 系统之正则表达式----grep 详解

一、正则表达式的起源:

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

随后,Ken Thompson发现可以将这一工作应用于使用计算搜索,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到熔融信息技术领域。自从那时起,正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被Open Group组织认定。

二、什么是正则表达式

百度百科解释为:

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

鸟哥Linux私房菜解释为:正规表达式就是处理字符串的方法,他是以行为单位来进行字符串的处理行为, 正规表达式透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序!

通俗解释:正则表达式就是通过一定的规则匹配获取文本中特定的内容的方法。

正则表达式的分类:

1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx  简称 BREs)

2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)

名词解释:
	字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件

三、为什么要使用正则表达式

当我们在时间有限的情况下要处理的非常多的文件,或者要处理非常大的文本文件时,通过正确使用正则表达式能让我们快速的检索到我们想要的文件或者文本信息,并可以把匹配的文件或文本信息打印出来,从而可以节省很多时间。

此外,正规表达式对于系统管理员来说是很重要的!因为系统没填都会产生很多的信息,这些信息有的重要有的仅是告知, 此时,管理员可以透过正规表达式的功能来将重要讯息打印出来,并产生便于查阅的报表来简化管理流程。

三、如何正确使用正则表达式

Linux处理正则表达式的主要程序是grep,本文将对其进行详细的讲解,以便读者可以更深一步的理解正则表达式的定义,并能在Linux系统中熟练的使用grep文本搜索工具。

3.1、什么是grep:

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式(正则表达元字符以及正常字符组合而成)搜索文本,并把匹配的行打印出来。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

3.2、grep的使用:

grep [OPTIONS] PATTERN [FILE...]

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

     OPTIONS主要参数如下:
         -o: only-matching 只显示被模式匹配到的内容
         -i: ignore case  不区分字符大小写
         -v: invert-match 显示不能够被模式匹配到的行
         -n: number 输出匹配行的同时在前面加上文件中的行数
         -c: count  输出匹配的数目(行数)
         -E: extended-regexp使用扩展的正则表达式 POSIX
         -A #:After的意思,显示匹配字符串后 # 行的数据
         -B #:before的意思,显示匹配字符串前 # 行的数据
         -C # 显示匹配字符串前后 # 行的数据
         --color=auto: 以特定颜色高亮显示匹配到的颜色

        --color=参数如下:
             auto
             always
             never

eg:

(1)、以特定颜色显示匹配到的关键字:

(2)、匹配/etc/passwd目录下含有root关键词的行

[[email protected] ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologi
[[email protected] ~]#

(3)、将/etc/passwd文件中,有出现 root 的行取出来,同时显示这些行在/etc/passwd文件中的行号

(4)、显示/proc/meminfo文件中以大写或小写S开头的行,用两种方法:

(5)、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

3.3、基本正则表达式元字符:

字符匹配:
        . : 匹配任意单个字符
        []: 匹配指定范围内的任意单个字符
        [^] : 匹配指定范围外的任意单个字符
        [0-9],[[:digit:]]      所有数字;
        [^0-9],[^[:digit:]]    所有除数字外的任意字符
        [a-z],[[:lower:]]      所有的小写字母
        [A-Z], [[:upper:]]     所有的大写字母
        [[:space:]]            所有的空白字符
        [[:punct:]]            所有的标点符号
        [0-9a-zA-Z],[[:alnum:]]所有的字母和数字;
        [a-zA-Z],[[:alpha:]]    所有的字母
        * : 匹配左侧字符任意次,表示0次、1次或多次;
        .*:   任意长度的任意字符
                    工作与贪婪模式
        \?:0次或1次;表示其左侧字符可有可无
        \+: 1次或多次;匹配其左慈字符至少出现1次
        \{m\}: m次:表示其左侧字符精确出现m次
        \{m,n\}:至少m次,至多n次
        \{0,n\}:至多n次
        \{m,\}:至少m次

eg:创建grep.txt 文件,内容如下:

. 匹配任意单个字符

使用 .*  匹配任意长度字符

匹配c前面至少出现3次b字符的行

(1)、找出/etc/passwd文件中的一位数或两位数;

(2)、找出/etc/passwd文件中的含有o连续出现两次的行

位置锚定:用于搜索要搜索的PATTERN在行中所处的位置
        ^: 锚定行首
            ^TATTERN  //搜索以PATTERN开头的行
        $: 锚定行尾
            PATTERN$    //搜索以PATTERN结尾的行

        ^PATTERN$  //搜索匹配整行内容
		# grep "^[[:space:]]*$" /etc/rc.d/rc.sysinit
        ^$: 匹配空白行;

eg:

(1)、搜索/etc/passwd 文件中以root为行首的行

(2)、搜索/etc/passwd 文件中以bash为行尾的行

(3)、搜索/etc/rc.d/rc.sysinit文件中以空白字符的行,并显示每行在文件中的行号

单词锚定:由非特殊字符组成的连续的字符串

        \< : 锚定词首,也可用\b
	    \<PATTERN, 或\bPATTERN
        \> : 锚定词尾,也可用\b
	    PATTERN\>, 或PATTERN\b

        \<PATTERN\>: 匹配PATTERN能匹配到的整个单词	

eg:

(1)、搜索/etc/passwd 文件中以root为单词词首的行

(2)、搜索/etc/passwd 文件中以nologin单词为词尾的行

(3)、搜索/etc/passwd 文件中包含单词shutdown的行

11

分组:\(\)
    注意:分组中的模式,在某次的具体匹配中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1,\2,...),因此,其匹配结果还可以被引用
\1: 引用,模式中自左而右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
\2: 引用,模式中自左而右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容;

eg:

(1)、创建fenzu.txt 文件  其内容如下,查找第二个单词和第四个单词是一个单词的行

He like his lover.

He like his liker.

She love her lover.

She love her liker.

例:

1、使用echo命令输出一个绝对路径,使用grep取出其基名;

[[email protected] ~]# echo /etc/passwd/ | grep -o "[[:alnum:]]\+\/\?$"
passwd/
[[email protected] ~]# echo /etc/passwd | grep -o "[[:alnum:]]\+\/\?$"
passwd
[[email protected] ~]#

2、找出ifconfig命令结果中的1-255之间数字;

[[email protected] ~]# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
eth0      Link encap:Ethernet  HWaddr 00:0C:29:49:03:2B  
          inet addr:192.168.67.129  Bcast:192.168.67.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe49:32b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX bytes:860103 (839.9 KiB)  TX bytes:510502 (498.5 KiB)
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

3、写一个模式,能匹配合理的IP地址;

1.0.0.1 -- 239.255.255.255

grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\>\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
时间: 2024-10-11 05:16:59

Linux 系统之正则表达式----grep 详解的相关文章

LR杂记 - Linux系统监控工具之vmstat详解

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

Ubuntu Linux系统下apt-get命令详解

Ubuntu Linux系统下apt-get命令详解(via|via) 常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package 安装包 sudo apt-get install package - - reinstall 重新安装包 sudo apt-get -f install 修复安装"-f = ——fix-missing&

Linux 系统下 ifconfig 命令详解

Linux系统下网卡网络配置详解 Ifconfig命令使LINUX核心知道软件回送和网卡这样一些网络接口,这样Linux就可以使用它们. 除了上面介绍的这些用法之外,ifconfig命令用来监控和改变网络接口的状态,并且还可以带上很多命令行参数.下面是一个ifconfig的通用调用语法: #ifconfig interface [[-net -host] address [parameters]] 其中interface是网络接口名:address是分配给指定接口的主机名或IP地址.这里使用的主

3、【Linux系统编程】系统目录详解

Linux系统目录详解 一.Linux系统目录结构 1.根目录/ 这就是根目录.对你的电脑来说,有且只有一个根目录.所有的东西,我是说所有的东西都是从这里开始.举个例子:当你在终端里输入"/home",你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录. 2./root 这是系统管理员(root user)的目录.对于系统来说,系统管理员就好比是上帝,它能对系统做任何事情,甚至包括删除你的文件.因此,请小心使用root帐号. 3./bin  /usr/bin  /usr/l

Linux系统的top命令详解

top默认视图 代码如下: 第一行:top - 15:32:23 up 738 days,  3:43,  5 users,  load average: 0.06, 0.08, 0.0815:29:50 - 当前系统时间 738 days,  3:41 - 系统已经运行了738天3小时14分钟(在这期间没有重启过)5 users - 当前有5个用户登录系统load average: 0.06, 0.09, 0.08 - load average后面的三个数分别是1分钟.5分钟.15分钟的负载情

linux系统下文件命令详解

/etc 目录下包含的用户信息文件有: 3.1.0 passwd: 用户库文件 用户名 UID,GID 和工作目录都在此文件中 Shadow:存放用户口令的文件,每个用户的 口令加密后都放在此文件中 Group :主要存储用户组信息 Fstab: 系统开机启动自动挂载分区列表,需要设置开机自动挂载的分区都可以在此文件中加入. Inittab: 这个命令的配置文件,此文件是linux启动的重要文件,用来完成对整个系统的基本初始化配置 Hosts: 设定用户自己的ip与名字的对应表,类似window

Linux系统常用命令nl详解

nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样,nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能.本文和大家分享的主要是linux中nl命令的相关用法,希望对大家学习linux有所帮助. 1.命令格式: nl [选项]- [文件]- 2.命令参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n): -b t :如果有空行,空

Linux系统挂载操作mount详解

在Linux系统中,文件系统不挂载是无法使用的.挂载,即是让文件系统在操作系统中可用.在Linux中使用mount命令来挂载文件系统,有永久性挂载和临时性挂载两种挂载方式. 1. 永久性挂载: 修改配置文件/etc/fstab,将需要挂载的文件系统写入这个配置文件中,再使用命令 mount -a 让配置信息生效,挂载的文件即可使用. 下图为配置文件/etc/fstab的内容,圈出来的一行便是我们需要加上去的信息. 挂载后,可使用mount查看相关信息,使用命令df -h 查看可用分区. 2. 临

Linux系统上部分命令详解

ifconfig,echo,tty,startx,export,pwd,history,shutdown,poweroff,reboot,hwclock,date ifconfig 格式:ifconfig [网络设备] [参数] 用途:查看和配置网络设备 参数 -a 查看已开启的端口信息 -s 显示摘要信息(类似于netstat -i) -promisc 设置是否支持网卡的promisc模式,如果选择此参数,网卡将接收网络中发给它所有的数据包 -allmulti 设置是否支持多播模式,如果选择此