0%

Linux 类终端 grep 命令的使用

摘要:使用grep命令,实现在命令行当中搜索指定文本。

概念简介

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。

Unix 的 grep 家族包括 grep、egrep 和 fgrep。egrep 和 fgrep 的命令只跟 grep 有很小不同。egrep 是 grep 的扩展,支持更多的 re 元字符, fgrep 就是 fixed grep 或 fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux 使用 GNU 版本的 grep。它功能更强,可以通过-G、-E、-F 命令行选项来使用 egrep 和 fgrep 的功能。这里我们使用的是常规的 grep 命令。

语法格式: grep [参数]

例 1: 在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:

1
2
grep match_pattern file_name
grep "match_pattern" file_name

例 2: 在多个文件中查找:

1
grep "match_pattern" file_1 file_2 file_3 ...

grep 中的正则表达式语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
^    # 锚定行的开始 如:'^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 命令,交给管道符之后使用 grep 已经不是匹配文件名了,这是对文件的操作,并不是匹配文件名。

通配符一般用于 linux 的 shell 命令中,例如:

grep hello *

这表示在当前目录下的 所有文件 中查找含“hello”字符串的文件的行。

下面列出一些通配符的含义:

1
2
3
4
[a-z]或[12]:匹配方括号中指定范围内的单个字符或方括号列出的其中一个字符。
[!9]:不匹配方括号中所列字符或指定范围内的单个字符。
*:匹配0个字符或多个字符。
?:匹配任何单个字符,且不能为空字符。

使用实例

1、输出 list.txt 文件中,匹配字符串 “text” 的行号

1
2
3
4
5
6
7
8
使用 -n 参数:

grep "text" -n list.txt
# 或
cat list.txt | grep "text" -n

#多个文件
grep "text" -n file_1 file_2

2、找出文件夹中,以 .txt 结尾的文件

1
2
3
4
5
6
7
8
# ls | grep -n ".txt$"

1:binggo.txt
2:hello1.txt
3:hello2.txt
4:hello3.txt
5:list.txt
6:mf.txt

3、找出文件夹中,以 h 开头,txt 结尾的文件

1
2
3
4
5
# grep -n "^h.\{1,\}txt$"

2:hello1.txt
3:hello2.txt
4:hello3.txt

4、查找命令行使用历史记录当中,包含 cd 的记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# history | grep cd

3 cd code
19 cd .ssh
22 cd .ssh
25 cd /Users/zhangminglei/Documents/git
36 cd ~
40 cd $ZSH_CUSTOM
……
158 mkdir hello ; cd ./hello
161 mkdir hello ; cd ./hello ; echo"hello" >hello.txt
162 mkdir hello ; cd ./hello ; echo "hello" >hello.txt
166 cd
……
208 cd hello
224 cd ..
334 mkdir test ; cd test ; echo "hello,legalgeek" >abc.txt