携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天
-r 参数:在所有子目录和子文件中查找
如果你不知道你要找的文本在哪个文件里,你可以用强大的 -r 参数。
r 是英语 recursive 的缩写,表示“递归”。
如果用了 -r 参数,那么 grep 命令使用时的最后一个参数(grep text file 这个模式中的 file)需要换成 directory,也就是必须是一个目录。因为 -r 参数是让 grep 命令能够在指定目录的所有子目录和子文件中查找文本。
例如:
grep -r "Hello World" folder/
表示在 folder 这个目录的所有子目录和子文件中查找 Hello World 这个文本。当然了,以上例子中,folder 后面的斜杠(/)不是必须的,这里只是为了清楚表明 folder 是一个目录。只要 folder 是一个目录,Linux 系统是不会搞错的。
Linux 中还有一个 rgrep 的命令,它的作用相当于 grep -r 。
grep 的高级用法:配合正则表达式
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
grep 配合正则表达式就可以实现比较高级的搜索了。
我们首先来看一眼以下的这个表格,表格中列出了最常用的一些正则表达式的字符以及其含义:
| 特殊字符 | 含义 | |
|---|---|---|
| . | 匹配除 “\n” 之外的任何单个字符 | |
| 行首(匹配输入字符串的开始位置) | ||
| $ | 行尾(匹配输入字符串的结束位置) | |
| [] | 在中括号中的任意一个字符 | |
| ? | 问号前面的元素出现零次或一次 | |
| * | 星号前面的元素可能出现零次、一次或多次 | |
| + | 加号前面的元素必须出现一次以上(包含一次) | |
| 逻辑或 | ||
| () | 表达式的分组(表示范围和优先度) |
当然了,上表没有列出所有的正则表达式的字符。
首先,为了让 grep 命令知道我们要使用正则表达式,须要加上 -E 参数(E 是 extended regular expression 的第一个字母,表示“扩展的正则表达式”)。例如:
grep -E Alias .bashrc
当然了,Linux 也有一个命令 egrep,其效果等同 grep -E 。
到此为止,没什么新鲜的。我们用正则表达式只是和之前的搜索类似。接下来,我们才真的要用到正则表达式的特殊字符了。
首先来看这个例子:
grep -E ^alias .bashrc
这个例子中,我们用到了 ^ 这个特殊符号,上面的表格里对于 ^ 已经做了说明:行首(匹配输入字符串的开始位置)。也就是说,^ 后面的字符须要出现在一行的开始。
再来举几个例子:
grep -E [Aa]lias .bashrc
[] 的作用,是将 [] 中的字符任取其一,因此 [Aa]lias 的意思就是既可以是 Alias,又可以是 alias。因此 grep 的搜索结果把包含 Alias 和 alias 的行都列出来了。
再比如:
grep -E [0-4] .bashrc
用于搜索包含 0 至 4 的任一数字的行。
grep -E [a-zA-Z] .bashrc
用于搜索包含在 a 至 z 之间的任意字母或者 A 至 Z 之间的任意字母的行。
其他正则表达式还有很多例子。就不一一列举了。