regexp:元字符
basic regexp:基本正则表达式
extended regexp:扩展正则表达式
grep: Global Research Regular Expression and Printing
grep
egrep
fgrep
使用方法:grep [option] PATTERN file1……
basic regexp:基本正则表达式的元字符
.匹配任意单个字符
grep 'r..t' /etc/passwd
*匹配其前面的字符任意次 包括0次
grep "r[a-z]*t" /etcpasswd匹配 以r开头t结尾 中间包含a-z任意次数的
grep 'ab*c' (开头必须是a 内容理由有c,b可以出现一次多次,或不出现,)
.*任意长度的任意字符
grep 'r.*t' /etc/passwd 贪婪模式 能匹配多长就匹配多长 直到最后一个
[]指定范围内的任意单个字符;只能有一个字符
[abc],[aA],[Cc]at,[a-z]
[^ab] 除了ab之外的任意单个字符
[^] 取反
也可以支持指定字符集
[:upper:] 大写字母
[:lower:] 小写字母
[:digit:] 数字
[:alpha:] 所有字母
[:alnum:] 字母数字
[:space:] 空字符,tab和space
[:punct:] 标点符号
使用方法[[:upper:]] 取反 [^[:upper:]]
?匹配相面的字符0次或1次
ab?c
abc abbc ac abbc肯定不行,因为只可以出现1次或0次
X\{m,n\} X字符至少出现m次 至多出现n次
X\{m,\} 至少出现m次,至多不限
X\{0,n\} 至多出现n次,至少不限
使用方法grep "[[:space:]]\{1,\}" test
注意:
grep "[[:space:]]\{1,\}" test
grep "[^[:space:]]\{1,\}" test
两者在文本中没有全空行的情况下效果一样,因为取反只是取非全空行,就字符就满足
锚定符
^行首锚定
grep "^r..t" /etc/passwd
$行尾锚定
grep "^r..t" /etc/passwd
^$空白行锚定
grep "^$" test
单词锚定符号(单词连续的字母,不包含特殊字符)
\<词首锚定 或 \b
grep "\<r..t" /etc/passwd
grep "\br..t" /etc/passwd
\>词尾锚定 或 \b
grep "r..t\>" /etc/passwd
grep "r..t\b" /etc/passwd
\<\>精确匹配 或 \b\b
grep "\<r..t\>" /etc/passwd
grep "\br..t\b" /etc/passwd
\(\)后向引用(前面是某个单词,后面是某个单词+x)
grep "\(l..e\).*\1r" text 截取包含以l..e开头后面任意字符直到相同l..e后加r的行
Grep选项
-v对结果取反
-i忽略字母大小写
-o仅显示匹配到字符串
-E支持扩展正则表达式
-A显示匹配行以及该行之后的行 + num 行号
-B之前
-C上下文
extended regexp:扩展正则表达式
\(\) --> ()
\{\} --> ()
+次数匹配,匹配其前的字符至少1次
|或者 {C|c} Cat or cat
C|cat C or cat
小练习
1、查找当前系统上名字为user1用户账号的相关信息在/etc/passwd,包含user11、myuser1
grep "^\buser1\b" /etc/passwd 考虑属组,锚定行首
查找形如user*这样的用户账户信息
grep "^user[0-9]\{1,\}\b" /etc/passwd
2、查找当前系统上以其为附加组的用户有两个或两个以上的组的相关信息,/etc/group
grep "," /etc/group 附加组必然有逗号
grep "," /etc/group | cut -d: -f1只显示这样组的组名
3、查找当前系统上其用户账号密码最长使用期为99999天的用户账户的相关信息
思路先确定最长使用时间的位置:
用户名:密码:最后修改时间:2次修最少改间隔:2次改最大间隔:警告:闲置:过期:保留
4、分析/etc/inittab文件中如下两行的文本特征,写出可以精确找到类似两行的模式.
形如:l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
思路:切片num,引用num
grep "^l\(.\):\1:.*\1$" /etc/inittab
grep "^l\([0-9]\{1,\}\):\1:.*\1$" /etc/inittab
5、显示/proc/meminfo文件中不区分大小写的s开头的行
grep "^[Ss]" /proc/meminfo
6、显示/etc/passwd中以nologin结尾的行
grep "nologin$" /etc/passwd
7、显示/etc/inittab中以#开头,且后跟一个或者多个空白字符串,而后跟任意非空白字符
grep "^#[[:space:]]\{1,\}[^[:space:]]*" /etc/inittab
8、显示/etc/inittab 中包含了 :num: 两个冒号中间一个数字的行
grep ":[0-9]:" /etc/inittab
9、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行
grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
10、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行
grep "^\([0-9]\).*\1$" /etc/inittab
11、显示出/etc/inittab中非空白的行
grep -v "^$" /etc/inittab
12、取出当前系统上以eth开头的网络设备的IP地址
ifconfig | grep -A 1 'eth' | grep -o "addr:[0-9.]\{1,\}" | cut -d: -f2
13、查询ifconfig中1位或者2位数字的行
ifconfig | grep -E "\b([1-9]|[1-9][0-9])\b"