Linux文件搜索(grep)

Linux文件搜索(grep)教程

Linux 中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

Linux grep命令使用

grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

grep 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2。我们利用这些返回值就可进行一些自动化的文本处理工作。

Linux grep命令详解

功能

用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

语法

grep [option] pattern file

参数

参数 描述
options grep 命令使用的参数。
pattern 匹配模式。
file 要搜索的文件。

grep命令常用参数

参数 描述
-a, --text 不要忽略二进制的数据。
-A<显示行数> 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c, --count 计算符合样式的列数。
-C<显示行数> 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作。
-e<范本样式> 指定字符串做为查找文件内容的样式。
-E, --extended-regexp 将样式为延伸的普通表示法来使用。
-f<规则文件> --file=<规则文件> 指定规则文件,其内容含有一个或多个规则样式,让 grep 查找符合规则条件的文件内容,格式为每行一个规则样式。
-F, --fixed-regexp 将样式视为固定字符串的列表。
-G, --basic-regexp 将样式视为普通的表示法来使用。
-h, --no-filename 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H, --with-filename 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i, --ignore-case 忽略字符大小写的差别。
-l, --file-with-matches 列出文件内容符合指定的样式的文件名称。
-L, --files-without-match 列出文件内容不符合指定的样式的文件名称。
-n, --line-number 在显示符合样式的那一行之前,标示出该行的列数编号。
-q, --quiet 不显示任何信息。
-r, --recursive 此参数的效果和指定 “-d recurse” 参数相同。
-s, --no-messages 不显示错误信息。
-v, --revert-match 显示不包含匹配文本的所有行。
-V, --version 显示版本信息。
-w, --word-regexp 只显示全字符合的列。
-x, --line-regexp 只显示全列符合的列。
-y 此参数的效果和指定 “-i” 参数相同。

grep正则表达式

说明

Linux 的 grep 指令经常配合正则表达式一起使用。

正则表达式列表

元字符 描述
^ 锚定行的开始,如:’^grep’ 匹配所有以 grep 开头的行。
$ 锚定行的结束,如:‘grep$’ 匹配所有以 grep 结尾的行。
. 匹配一个非换行符的字符,如:‘gr.p’ 匹配 gr 后接一个任意字符,然后是 p。
* 匹配零个或多个先前字符,如:’*grep’ 匹配所有一个或多个空格后紧跟 grep 的行。
.* 一起用代表任意字符。
[] 匹配一个指定范围内的字符,如 ‘[Gg]rep’ 匹配 Grep 和 grep。
[^] 匹配一个不在指定范围内的字符,如:’[^A-FH-Z]rep’ 匹配不包含 A-R 和 T-Z 的一个字母开头,紧跟 rep 的行。
\(…\) 标记匹配字符,如 ‘\(love\)’,love 被标记为 1。
\< 锚定单词的开始,如: ‘\<grep’ 匹配包含以 grep 开头的单词的行。
\> 锚定单词的结束,如 ‘grep\>’ 匹配包含以 grep 结尾的单词的行。
x\{m\} 重复字符 x,m 次,如:‘0\{5\}’ 匹配包含 5 个 o 的行。
x\{m,\} 重复字符 x,至少 m 次,如:‘o{5,}’ 匹配至少有 5 个 o 的行。
x\{m,n\} 重复字符 x,至少 m 次,不多于 n 次,如:‘o{5,10}’ 匹配 5–10 个 o 的行。
\w 匹配文字和数字字符,也就是 [A-Za-z0-9],如:‘G\w*p’ 匹配以 G 后跟零个或多个文字或数字字符,然后是 p。
\W \w 的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b 单词锁定符,如: ‘\bgrep\b’ 只匹配 grep。

grep POSIX字符

说明

为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface) 增加了特殊的字符类。要把它们放到 [] 号内才能成为正则表达式。在 linux 下的 grep 除 fgrep 外,都支持 POSIX 的字符类。

POSIX字符

POSIX字符 描述
[:alnum:] 文字数字字符。
[:alpha:] 文字字符。
[:digit:] 数字字符。
[:graph:] 非空字符(非空格、控制字符)。
[:lower:] 小写字符。
[:cntrl:] 控制字符。
[:print:] 非空字符(包括空格)。
[:punct:] 标点符号。
[:space:] 所有空白字符(新行,空格,制表符)。
[:upper:] 大写字符。
[:xdigit:] 十六进制数字(0-9,a-f,A-F)。

Linux grep命令常用实例

实例

实例 描述
grep str file 在文件 file 中,搜索 str 字符串
grep -r str dir 以递归方式在文件夹 dir 中查找包含 str 的文件
grep -v str file 在文件 file 中,查找不包含 str 的行
grep -i str file 在文件 file 中,忽略大小写搜索 str 字符串
cmd | grep str 在命令 cmd 的输出查找 str 字符串

文件搜索内容

语法

grep str file

案例

我们使用 grep 命令,在文件 /etc/passwd 中搜索内容,具体命令如下:

grep nologin /etc/passwd

运行后,终端输出如下:

58_Linux文件搜索grep命令.png

我们看到,我们使用了 grep 命令,在文件中,搜索了包含 nologin 的行,并输出。

文件夹递归搜索内容

语法

grep -r str dir

案例

我们使用 grep 命令,在文件夹 /etc 中搜索内容,具体命令如下:

grep -r nologin /etc/*

运行后,终端输出如下:

59_Linux文件搜索grep命令.png

我们看到,我们使用了 grep 命令,在文件夹 /etc 下,递归搜索了包含 nologin 的行,最终输出了文件名与匹配的行。

查找不包含字符串的行

语法

grep -v str file

案例

我们使用 grep 命令,在文件 /etc/passwd 中搜索不包含指定字符串的内容,具体命令如下:

grep -v nologin /etc/passwd

运行后,终端输出如下:

60_Linux文件搜索grep命令.png

我们看到,我们使用了 grep 命令,在文件中,搜索了不包含 nologin 的行,并输出。

忽略大小写搜索

语法

grep -i str file

案例

我们使用 grep 命令,在文件 /etc/passwd 中忽略大小写搜索指定字符串的内容,具体命令如下:

grep -i mariadb /etc/passwd

运行后,终端输出如下:

61_Linux文件搜索grep命令.png

我们看到,我们使用了 grep 命令,在文件中,搜索了 mariadb 的行,并输出,我们看到,我们使用 i 参数,忽略大小写进行了搜索。

最后,匹配了 MariaDB 的行,因为,我们忽略了大小写。

Linux文件搜索(grep)总结

Linux 中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。