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.configgrep '\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

#shell-scripting