在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中任意一个数字 #|:表示或