Linux 中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2。我们利用这些返回值就可进行一些自动化的文本处理工作。
用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。
grep [option] pattern file
参数 | 描述 |
---|---|
options | grep 命令使用的参数。 |
pattern | 匹配模式。 |
file | 要搜索的文件。 |
参数 | 描述 |
---|---|
-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” 参数相同。 |
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。 |
为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface) 增加了特殊的字符类。要把它们放到 [] 号内才能成为正则表达式。在 linux 下的 grep 除 fgrep 外,都支持 POSIX 的字符类。
POSIX字符 | 描述 |
---|---|
[:alnum:] | 文字数字字符。 |
[:alpha:] | 文字字符。 |
[:digit:] | 数字字符。 |
[:graph:] | 非空字符(非空格、控制字符)。 |
[:lower:] | 小写字符。 |
[:cntrl:] | 控制字符。 |
[:print:] | 非空字符(包括空格)。 |
[:punct:] | 标点符号。 |
[:space:] | 所有空白字符(新行,空格,制表符)。 |
[:upper:] | 大写字符。 |
[:xdigit:] | 十六进制数字(0-9,a-f,A-F)。 |
实例 | 描述 |
---|---|
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
运行后,终端输出如下:
我们看到,我们使用了 grep 命令,在文件中,搜索了包含 nologin 的行,并输出。
grep -r str dir
我们使用 grep 命令,在文件夹 /etc 中搜索内容,具体命令如下:
grep -r nologin /etc/*
运行后,终端输出如下:
我们看到,我们使用了 grep 命令,在文件夹 /etc 下,递归搜索了包含 nologin 的行,最终输出了文件名与匹配的行。
grep -v str file
我们使用 grep 命令,在文件 /etc/passwd 中搜索不包含指定字符串的内容,具体命令如下:
grep -v nologin /etc/passwd
运行后,终端输出如下:
我们看到,我们使用了 grep 命令,在文件中,搜索了不包含 nologin 的行,并输出。
grep -i str file
我们使用 grep 命令,在文件 /etc/passwd 中忽略大小写搜索指定字符串的内容,具体命令如下:
grep -i mariadb /etc/passwd
运行后,终端输出如下:
我们看到,我们使用了 grep 命令,在文件中,搜索了 mariadb 的行,并输出,我们看到,我们使用 i 参数,忽略大小写进行了搜索。
最后,匹配了 MariaDB 的行,因为,我们忽略了大小写。
Linux 中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。