Linux 基本命令 grep、egrep、fgrep 用法与正则表达式
目录
grep、egrep、fgrep 命令定义
grep(global search regular expression and print out the line) 是一种强大的文本搜索工具。它只能使用基本的正则表达式来搜索文本,并把匹配的行打印出来。grep 的主要功能是进行字符串数据的比较,然后把符合用户需求的字符串打印出来。注意 grep 在数据中查找一个字符串时,是以”整行”为单位进行数据筛选的。
egrep
等同于 grep -E,利用此命令可以使用扩展的正则表达式对文本进行搜索,并把符合用户需求的字符串打印出来。
fgrep
等同于 grep -F,它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度最快。
基本用法
grep [option] '搜索字符串' filename
grep 常用选项
| 选项 | 说明 |
|---|---|
-a | 在二进制文件中,以文本文件的方式搜索数据 |
-c | 计算找到搜索字符串的次数 |
-i | 忽略大小写 |
-v | 反向查找,即显示没有搜索字符串内容的那行 |
-o | 只显示被模式匹配的字符串 |
-n | 输出行号 |
--colour(color) | 颜色显示 |
-A n | 显示匹配到字符那行的后面 n 行 |
-B n | 显示匹配到字符那行的前面 n 行 |
-C n | 显示匹配到字符那行的前后 n 行 |
正则表达式
正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。通过一些特殊符号的辅助,可以让用户轻松搜索/替换某特定的字符串。
正则表达式分为两类:基本的正则表达式和扩展的正则表达式。
基本的正则表达式
元字符
| 符号 | 说明 | 示例 |
|---|---|---|
. | 匹配任意单个字符 | grep 'student.' /etc/passwd 查找包含 student 且后面带一个字符的行 |
[] | 匹配指定范围内的任意单个字符 | grep '[0-9]' /etc/passwd 查找带有数字的行 |
[^] | 匹配指定范围外的任意单个字符 | grep '[^a-z]' /etc/inittab 查找没有小写字母的行 |
[:space:] | 表示空白字符 | |
[:punct:] | 表示所有标点符号的集合 | |
[:lower:] | 表示所有的小写字母 | |
[:upper:] | 表示所有的大写字母 | |
[:alpha:] | 表示大小写字母 | |
[:digit:] | 表示数字 | |
[:alnum:] | 表示数字和大小写字母,使用格式 [[:alnum:]] |
次数匹配
| 符号 | 说明 | 示例 |
|---|---|---|
* | 匹配其前面的字符任意次 | grep 'root*' /etc/passwd 查找 root 出现 0 次或以上的行 |
.* | 任意字符 | grep 'root.*' /etc/passwd 查找包含 root 的行 |
\? | 匹配其前面的字符 1 次或 0 次 | |
\{m,n\} | 匹配其前字符最少 m,最多 n 次 |
字符锚定
| 符号 | 说明 | 示例 |
|---|---|---|
^ | 锚定行首,此字符后面的任意内容必须出现在行首 | grep '^#' /etc/inittab 查找行首以 # 开头的行 |
$ | 锚定行尾,此字符前面的任意内容必须出现在行尾 | grep 'root$' /etc/inittab 查找以 root 结尾的行 |
^$ | 锚定空白行 | |
\< 或 \b | 锚定词首 | grep '\<root' /etc/man.config 查找 root 做为单词首部的行 |
\> 或 \b | 锚定词尾 | grep '\<root\>' /etc/man.config 或 grep '\broot\b' 查找单独的 root 单词 |
扩展的正则表达式
扩展的正则表达式是在基本的正则表达式上作出了小小的修改:
- 把
\( \)写成() - 把
\{ \}写成{ } - 另外加入了
+(至少出现一次,无上限)和|(或,二取一) - 在扩展正则表达式中不需要对
( ) { } . ? |加转义
扩展表达式中的次数匹配
| 符号 | 说明 | 示例 |
|---|---|---|
* | 匹配其前面字符的任意次 | |
? | 匹配其前面字符的 0 次或 1 次 | |
+ | 匹配其前面字符至少 1 次 | [[:space:]]+ 至少一个空白符 |
{m,n} | 匹配其前面字符 m 到 n 次 |
特殊字符
| 符号 | 说明 | 示例 |
|---|---|---|
| | 或者,二取一 | grep -E 'c|cat' file 查找包含 c 或 cat 的行 |
\. | 转义字符,表示符号 . |
实践示例
# (1) 显示 /etc/inittab 中以 # 开头且后面跟一个或多个空白符,而后又跟了任意非空白符的行
grep '#[[:space:]]*[^[:space:]]' /etc/inittab
# (2) 输出不是数字开头的行
grep '^[^0-9]' /etc/passwd
# (3) 输出行首是 1 或 2
grep '^\(1\|2\)' /etc/inittab
# 或
grep -E '^(1|2)' /etc/inittab
# (4) 查找前面是 rc 中间接任意字符而后跟 /rc
grep '.*\(rc\).*\/\1.*' /etc/inittab
# (5) 取出当前电脑上的 IP
ifconfig | grep -A 1 "^eth0" | grep '[0-9.]\{1,\}' | cut -d: -f2
# (6) 查找当前系统上名字为 student(必须出现在行首)的用户账户的相关信息
grep "^student" /etc/passwd