grep+正则表达式

前端之家收集整理的这篇文章主要介绍了grep+正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


在Linux运维中会经常使用到三剑客中的grep命令,grep命令对文本文件搜索搜索是以行为单位进行的,用于搜索指定匹配模式中的行。grep命令在不使用正则表式可以完成简单的一些工作,当你面对几万行或更多的文件时,你是不是已经醉了@_@。。。那就请使用正则表达式吧,它是你强大而有力的助手。

他们都说正则表达式很难,你是不是已经害怕了呢?如果你想在几分钟之内就能完全的精通正则表达式,要么你是一个天才,要么你是从外星球来的。

学习正则表式是要经过长期的不断的练习,我相信你就是下一个天才。。

正则表达式分为基本正则表达式与扩展正则表达式。

我希望我能以最简单的例子让你明白grep和正则表达式中一些简单的用法


(1)查找/etc/passwd文件中有“root”字样的行:

[root@Bisc-lab01~]#grep-n--color"root"/etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
#-n:表示显示查找到的行号
#--color:用颜色来高亮显示所匹配的内容
#”root”:查找行有”root”字样的行,这就是我们要查找的条件
#/etc/passwd:指定查找的文件,可以是绝对路径或相对路径

(2)查找/etc/passwd文件,只显示数字为两位数的数字

[root@Bisc-lab01~]#grep-o"\b[0-9]\{2\}\b"/etc/passwd
12
10
14
……………省略输出……………
#-o:只显示被模式匹配到内容
#\b:用于锚定模式的词首,不是行首哦!!!使用“\<”等于“\b”。
#[0-9]:表示所有的数字,也可以用[:digit:]表示0-9。[]在表示区间范围,在正则表达式中表示
#匹配区间范围内单个任意字符。如果我想取除了数字之外的任意字符呢?使用“[^]”。
#\{2\}:表示精确的匹配其前一个字符出现2次。
#\b:锚定词尾,等价于“\>”

(3)查找/etc/passwd文件中,以r开头其后跟着任意的字符,但以sh结尾的行。

[root@Bisc-lab01~]#grep"^r.*sh$"/etc/passwd
root:x:0:0:root:/root:/bin/bash
#^:表示行首,“^r”表示以r为行首的行
#.*:表示任意字符任意次,“.”(点):表示任意单个字符;“*”:表示其前个字符出现任意次,
#可以是0次,1次或更多;“.*”:组合起来就来就表示任意字符出现任意次。
#$:表示行尾,“sh$”:表示以sh结尾的行。

(4)查找/etc/passwd文件中,以其字母开为行首,必以其字母结尾的行。

思路
分析此题:表示以什么字母为行首,就以什么字母结束,如a………a,中间是任意的字符,
[root@Bisc-lab01~]#grep"^\([a-zA-Z]\).*\1$"/etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nfsnobody:x:65534:65534:AnonymousNFSUser:/var/lib/nfs:/sbin/nologin
hadoop:x:600:600::/home/hadoop:/bin/bash
#[a-zA-Z]:表示所有字母,其a-zA-Z等价于[:alpha:],如果[[:alpha:]]*是什么意思呢?将会出现
#匹配到所有的/etc/passwd的行。
#\(\):表示分组,意思就是用于记忆grep匹配过程中[a-zA-Z]的值。
\1:引用,从左至右的每一个括号中的匹配过程中的值。

(5)查找ifconfig命令结果输出的所有1-255的数字

思路:
分析此题:1-255数字的构成,我们可以这样的来分析:
1-9:[1-9]
10-99:[1-9][0-9]
100-199:1[0-9][0-9]
200-249:2[0-4][0-9]
250-255:25[0-5]
在查找中可能会有1位的数,2位的数或3位的数,所以我们要使用扩展正则表达式中的或“|”
[root@Bisc-lab01~]#ifconfig|grep-E"\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b"
eth0Linkencap:EthernetHWaddr00:0C:29:32:A8:C8
inetaddr:172.16.9.20Bcast:172.16.255.255Mask:255.255.0.0
inet6addr:fe80::20c:29ff:fe32:a8c8/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXbytes:7258553(6.9MiB)TXbytes:764629(746.7KiB)
inetaddr:127.0.0.1Mask:255.0.0.0
inet6addr:::1/128Scope:Host
UPLOOPBACKRUNNINGMTU:65536Metric:1
RXpackets:24errors:0dropped:0overruns:0frame:0
TXpackets:24errors:0dropped:0overruns:0carrier:0
RXbytes:1940(1.8KiB)TXbytes:1940(1.8KiB)
#\b:表示锚定词首
#():表示分组,在此题中用于表示标识一个词,也就是1-255其中的一个数,扩展正则表达式的()括号不用\转义。
#[1-9]:表示1到9中任意一个数字
#|:表示或

猜你在找的正则表达式相关文章