一 、 grep及egrep的基本介绍:
首先我们要知道grep的这个命令的本身意思即:
grep [Global search REgular expression and Print out the line ] 全局搜索正则表达式匹配到的内容,并且打印出匹配内容所在行
grep 是一个很常用但是也很强大的搜索工具,它是以正则表达式为基础,搜索文本文件中符合要求的字符串,并且显示所匹配的字符串所在行。
grep搜索的内容是以一行来显示的,当然我们可以使用一些特别的选项来只显示我们所匹配到的内容,这个稍后会为你讲解到,grep一般会与(|)管道
像结合使用,grep+基本正则表达式+管道 则是我们在实际操作中用到最多的组合。
二、 grep 命令的使用方法
使用语法格式:
grep [OPTIONS] PATTERN [FILE...]
-c:只输出匹配行的计数。
-i:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-e: 即egrep,配合扩展正则表达式使用和grep同样的用法
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:反向选取,显示不包含匹配文本的所有行
-o:仅显示匹配的字串,而非字串所在的行
-A +#:显示匹配行后#行
-B +#:显示匹配行前#行
-C +#:显示匹配行前后各#行
egrep = grep -e 用法与grep相同,配合扩展正则表达式使用,打印出匹配到的字符串。我们前面一直在说grep或egrep 配合正则表达式使用,那么什么是正则表达式呢?下面为你介绍,linux入门很重要的知识,正则表达式
三、正则表示 RE[Regular Expression]
正则表示基础概念
是一类字符所书写的模式,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。其中许多字符不表示其字面意义,而是表达控制或通配等功能,简明的说,正则表达式就是使用一些字符组合成的规则,来配合搜索命令让用户方便快捷的完成目的。
正则表示分 基础正则表达式 与 扩展正则表达式 两种类型。
一)基本正则表达式:
基本正则表达式通常使用的元字符如下:
1、 字符匹配
. : 表示任意单个字符
[]: 匹配指定范围内的任意单个字符
[0-9] 匹配0-9内的任意单个数字同[[:digit:]]
[a-z]匹配a-z内的任意单个字母同[[:lower:]]
[A-Z]与[a-z]类似 同[[:upper:]]
[[:space:]] 匹配空格
[[:digit:]]匹配任意单个数字
[[:lower:]]匹配任意单个小写字母
[[:upper:]]匹配任意单个大写字母
[[:punct:]]匹配任意单个字符
[[:alpha:]]匹配任意单个字母
[[:alnum:]]匹配任意单个字母或数字
2、 次数匹配元字符,用于指定其前面的字符出现的次数
* : 表示任意长度,他前面的字符可以出现任意次
\? : 表示0次或1次,它前面的字符可有可无
例如:x\?y 有以下可能:
y 或者 xy
\{m\}: m次,它前的字符要出现m次
例如:x\{2\}y
可能为: xy, xxy, y, xxxxy, xyy
\{m,n\}: 至少m次,至多n次
例如:x\{2,5\}y
可能为: xy, y, xxy
\{m,\}:至少m次
\{0,n\}: 至多n次
.*:任意长度的任意字符
例如:显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
[root@localhost ~]# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
3、 位置锚定元字符,用于指定匹配字符所在行的具体位置
^: 行首锚定;
后跟的字符出现在行首
例如:搜索/etc/passwd 文件内以a开头的行
[root@localhost ~]# grep --color=auto "^a" /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
$: 行尾锚定:
后跟的字符出现在行尾
例如: 搜索/etc/passwd 文件内以bash结尾的行(由于内容太多,我只列出几行做示例)
[root@localhost ~]#grep "\bbash\b$" /etc/passwd
x1:x:3320:3320::/home/x1:/bin/bash
x2:x:3321:3321::/home/x2:/bin/bash
mmm1:x:3322:3322::/home/mmm1:/bin/bash
mmm2:x:3323:3323::/home/mmm2:/bin/bash
不包含特殊字符的连续字符组成的串叫单词:
\<或\b: 词首,出现于单词左侧,
>或\b: 词尾,出现于单词右侧
^$: 表示空白行
4、分组和引用
分组:
\(\):把小括号内的内容当做单个字符来使用
引用:
\#: 引用第n个括号所匹配到的内容,而非模式本身。
例如: \(xyz\).*\1 = xyz.*xyz
二) 扩展正则表达式
扩展正则表达式主要是指 egrep fgrep 及几个相关的特殊元字符
特殊元字符
+ 表示它前面的字符至少出现一次。
? 表示0个或1一个字符,与基本正则表达式里的\?不同,请注意
| 用或的方式选择|两边的字符。
() 用户组字符串,就是把元字符内的看做是一个组一个整体。
四、举2个grep + 正则表达式的结合使用示例:
(1)显示当前系统上root、fedora或user1用户的信息;
[root@localhost ~]#egrep "^(root|fedora|user1):" /etc/passwd
root:x:0:0:root:/root:/bin/bash
本例题,用到行首锚定^和扩展正则表达式中的"|",所以要用egrep,由于我的系统上每添加fedora和user1用户,故只显示root的信息。
(2)使用echo命令输出一个路径,而后使用grep取出其基名
[root@localhost ~]#echo "/etc/passwd/" | grep -o -E "[[:alnum:]]+/?$"
passwd/
这个例题中,用到了grep ,管道,以及扩展正则表达式,可以说是以后最常用到的模式,来处理教复杂点的问题,同时也用到了正则表达式的各种元字符。