什么是grep、正则表达式以及其分类:
1、grep:(Global Research)根据模式,搜索文本,并将符合模式的文本行显示出来,使用基本正则表达式定义的模式来过滤文本的命令,它在一个或多个文件中搜索字符串模板,如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
格式:grep [option] PATTERN [FILE...] (本身意义是部分匹配,显示的是整行)
-i:忽略大小写
--color:被匹配的字符串显示颜色
-v:显示没有被模式匹配的行
-o:只显示被模式匹配的字符串
-E:使用扩展正则表达式
-B:表示显示指定位置的后两行;
-C:表示显示指定位置的前后各两行;
2、正则表达式:Regular REGEXP
是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
3、给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
a、给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
b、可以通过正则表达式,从字符串获取我们想要的特定部分。
4、正则表达式的特点是:
a、灵活性、逻辑性和功能性非常的强;
b、可以迅速地用极简单的方式达到字符串的复杂控制。
c、对于刚接触的人来说,比较难悟。
5、正则表达式分为两类:基本正则表达式(basic regexp),扩展正则表达式(extended regexp)
A、基本正则表达式:
①元字符:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]:数字符号
[:lower:]:小写字母符号
[:upper:]:大写字母符号
[:punct:]:标点符号
[:space:]:空白字符
[:alpha:]:大小写字符
[:alnum:]:数字和大小写字母
②匹配次数:(贪婪模式)
*:匹配其前面的字符任意次
例: a,b,ab,aab,acb,adb,amnb
a*b 符合的有:b,aab
a.*b符合的有:ab,
.*:任意长度的任意字符
\?:匹配其前面的字符1次或0次
\{m,n\}:匹配其前面的字符至少m次,至多n次
③位置锚定:
^:锚定行首,此字符后面的任意内容必须出现在行首 例:grep '^r..t' /etc/passwd
$:锚定行尾,此字符后面的任意内容必须出现在行尾 例:grep 'w$' /etc/inittab
^$:锚定空白行 例:grep '^$' /etc/inittab | wc -l
\<或\b:锚定词首,其后面的任意字符必须作为单词首部出现 例:grep "\<root" test.txt
\>或\b:锚定词尾,其前面的任意字符必须作为单词尾部出现
④分组:
\(\)
例:\(ab\)* 表示ab出现0次或者多次
⑤后向引用
\1:第一个左括号以及与之对应的右括号所包含的所有内容 例:grep '\(\..e\).*\1' test3.txt
B、扩展正则表达式
①字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]:数字符号
[:lower:]:小写字母符号
[:upper:]:大写字母符号
[:punct:]:标点符号
[:space:]:空白字符
[:alpha:]:大小写字符
[:alnum:]:数字和大小写字母
②次数匹配:
*:匹配其前面的字符任意次
?:匹配其前面的字符1次或0次
+:匹配其前面的字符至少1次
例:#grep -E '^[[:space:]]+' /boot/prub/grub.conf
{m,n}:匹配其前面的字符至少m次,至多n次,注意:在扩展正则表达式中没有\
③位置锚定:
^:锚定行首,此字符后面的任意内容必须出现在行首
$:锚定行尾,此字符后面的任意内容必须出现在行尾
\<:或\b:锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b:锚定词尾,其前面的任意字符必须作为单词尾部出现
④分组:
():在扩展正则表达式分组没有\
⑤后向引用:
\1:第一个左括号以及与之对应的右括号所包含的所有内容 例:grep-E '(..e).*\1' test3.txt
|:or表示字符的选择
例:C|cat:表示C或cat
命令别名:grep -E=egrep
\.:表示元字符本身的意义
例:找出文件/boot/prub/prub.conf中的所有ip地址
#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])\> /boot/prub/prub.conf
练习:
#grep -i '^s' /proc/meminfo
#grep '^sS' /proc/meminfo
2、显示/etc/passwd中以nologin结尾的行;
#grep 'nologin$' /etc/passwd
取出默认shell为/sbin/nologin的用户列表
#grep '/sbin/nologin' /etc/passwd | cut -d: -f1
#grep 'bash$' /etc/passwd |sort -n -t:-k3 |head -1 |cut -d: -f1
3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
#grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/inittab
4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
#grep ':[0-9]:' /etc/inittab
#grep '^[[:space:]]\{1,\}.*' /boot/grub/grub.conf
#grep '^\([0-9]\).*\1$' /etc/inittab
7、找出某文件中的,1位数,或2位数;
#grep '\b[0-9]\{1,2\}\b' /etc/passwd
#grep '\<[0-9]\{1,2\}>b' /proc/cpuinfo
8、找出ifconfig命令结果中的1-255之间的整数;
#ifconfig | egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
#grep '^student\>' /etc/passwd
或
#grep '^student:' /etc/passwd
#grep '^student\>' /etc/passwd | cut -d: -f3
或
#id -u student
10、分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式:
11:1:wait:/etc/rc.d/rc 1
13:3:wait:/etc/rc.d/rc 3
#grep 'l\([0-9]\):\1:wait:/etc/rc.d/rc \1' /etc/inittab
或
#grep '^l\([0-9]\):\1.*\1$' /etc/inittab