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外,还有egrep、fgrep。egrep是grep的扩展,相当于grep -E。fgrep相当于grep -f,用的少。
Usage: grep [OPTION]... PATTERN [FILE]...
支持的正则 | 描述 |
---|---|
-E,--extended-regexp | 模式是扩展正则表达式(ERE) |
-F,--fixed-strings | 模式是换行分隔固定字符串 |
-G,--basic-regexp | 模式是基本正则表达式(BRE) |
-P,--perl-regexp | 模式是Perl正则表达式 |
-e,--regexp=PATTERN | 使用模式匹配,可指定多个模式匹配 |
-f,--file=FILE | 从文件每一行获取模式 |
-i,--ignore-case | 忽略大小写 |
-w,--word-regexp | 模式匹配整个单词 |
-x,--line-regexp | 模式匹配整行 |
-v,--invert-match | 打印不匹配的行 |
输出控制 | 描述 |
---|---|
-m,--max-count=NUM | 输出匹配的结果num数 |
-n,--line-number | 打印行号 |
-H,--with-filename | 打印每个匹配的文件名 |
-h,--no-filename | 不输出文件名 |
-o,--only-matching | 只打印匹配的内容 |
-q,--quiet | 不输出正常信息 |
-s, --no-messages | 不输出错误信息 |
-r,--recursive --include=FILE_PATTERN --exclude=FILE_PATTERN --exclude-from=FILE --exclude-dir=PATTERN | 递归目录。 只搜索匹配的文件。 跳过匹配的文件。 跳过匹配的文件,来自文件模式。 跳过匹配的目录 |
-c,--count | 只打印每个文件匹配的行数 |
内容行控制 | 描述 |
---|---|
-B,--before-context=NUM | 打印匹配的前几行 |
-A,--after-context=NUM | 打印匹配的后几行 |
-C,--context=NUM | 打印匹配的前后几行 |
--color[=WHEN], | 匹配的字体颜色 |
示例:
1) 输出b文件中在a文件相同的行
1 | # grep -f a b |
---|
2) 输出b文件中在a文件不同的行
1 | # grep -v -f a b |
---|
3) 匹配多个模式
1 2 3 | # echo "a bc de" |xargs -n1 |grep -e 'a' -e 'bc' a bc |
---|
4) 去除空格http.conf文件空行或开头#号的行
1 | # grep -E -v "^$|^#" /etc/httpd/conf/httpd.conf |
---|
5) 匹配开头不分大小写的单词
1 2 3 4 5 | # echo "A a b c" |xargs -n1 |grep -i a 或 # echo "A a b c" |xargs -n1 |grep '[Aa]' A a |
---|
6) 只显示匹配的字符串
1 2 3 | # echo "this is a test" |grep -o 'is' is is |
---|
7) 输出匹配的前五个结果
1 2 3 4 5 6 | # seq 1 20 |grep -m 5 -E '[0-9]{2}' 10 11 12 13 14 |
---|
8)统计匹配多少行
1 2 | # seq 1 20 |grep -c -E '[0-9]{2}' 11 |
---|
9) 匹配b字符开头的行
1 2 | # echo "a bc de" |xargs -n1 |grep '^b' bc |
---|
10) 匹配de字符结尾的行并输出匹配的行
1 2 | # echo "a ab abc abcd abcde" |xargs -n1 |grep -n 'de$' 5:abcde |
---|
11) 递归搜索/etc目录下包含ip的conf后缀文件
1 | # grep -r '192.167.1.1' /etc --include *.conf |
---|
12) 排除搜索bak后缀的文件
1 | # grep -r '192.167.1.1' /opt --exclude *.bak |
---|
13) 排除来自file中的文件
1 | # grep -r '192.167.1.1' /opt --exclude-from file |
---|
14) 匹配41或42的数字
代码语言:javascript复制# seq 41 45 |grep -E '4[12]'
41
42
15) 匹配至少2个字符
代码语言:javascript复制# seq 13 |grep -E '[0-9]{2}'
10
11
12
13
16) 匹配至少2个字符的单词,最多3个字符的单词
代码语言:javascript复制# echo "a ab abc abcd abcde" |xargs -n1 |grep -E -w -o '[a-z]{2,3}'
ab
abc
17) 匹配所有IP
1 | # ifconfig |grep -E -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" |
---|
18) 打印匹配结果及后3行
代码语言:javascript复制# seq 1 10 |grep 5 -A 3
5
6
7
8
19) 打印匹配结果及前3行
代码语言:javascript复制# seq 1 10 |grep 5 -B 3
2
3
4
5
20) 打印匹配结果及前后3行
代码语言:javascript复制# seq 1 10 |grep 5 -C 3
2
3
4
5
6
7
8
21) 不显示输出
不显示错误输出:
代码语言:javascript复制# grep 'a' abc
grep: abc: No such file or directory
# grep -s 'a' abc
# echo $?
2
不显示正常输出:
# grep -q 'a' a.txt
grep支持上一章的基础和扩展正则表达式字符。
grep常用用法
代码语言:javascript复制[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!
将/etc/passwd,有出现 root 的行取出来
代码语言:javascript复制# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
或
# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
将/etc/passwd,有出现 root 的行取出来,同时显示这些行在/etc/passwd的行号
代码语言:javascript复制# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
30:operator:x:11:0:operator:/root:/sbin/nologin
在关键字的显示方面,grep 可以使用 --color=auto 来将关键字部分使用颜色显示。 这可是个很不错的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又显的很麻烦~ 此时那个好用的 alias 就得来处理一下啦!你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可喔! 这样每次运行 grep 他都会自动帮你加上颜色显示啦
将/etc/passwd,将没有出现 root 的行取出来
代码语言:javascript复制# grep -v root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
将/etc/passwd,将没有出现 root 和nologin的行取出来
代码语言:javascript复制# grep -v root /etc/passwd | grep -v nologin
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示:
代码语言:javascript复制[root@www ~]# dmesg | grep -n --color=auto 'eth'
247:eth0: RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84, IRQ 10
248:eth0: Identified 8139 chip type 'RTL-8139C'
294:eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
305:eth0: no IPv6 routers present
# 你会发现除了 eth 会有特殊颜色来表示之外,最前面还有行号喔!
在关键字的显示方面,grep 可以使用 --color=auto 来将关键字部分使用颜色显示。 这可是个很不错的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又显的很麻烦~ 此时那个好用的 alias 就得来处理一下啦!你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可喔! 这样每次运行 grep 他都会自动帮你加上颜色显示啦
用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起捉出来显示
代码语言:javascript复制[root@www ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth'
245-PCI: setting IRQ 10 as level-triggered
246-ACPI: PCI Interrupt 0000:00:0e.0[A] -> Link [LNKB] ...
247:eth0: RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84, IRQ 10
248:eth0: Identified 8139 chip type 'RTL-8139C'
249-input: PC Speaker as /class/input/input2
250-ACPI: PCI Interrupt 0000:00:01.4[B] -> Link [LNKB] ...
251-hdb: ATAPI 48X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048kB Cache, UDMA(66)
# 如上所示,你会发现关键字 247 所在的前两行及 248 后三行也都被显示出来!
# 这样可以让你将关键字前后数据捉出来进行分析啦!
根据文件内容递归查找目录
代码语言:javascript复制# grep ‘energywise’ * #在当前目录搜索带'energywise'行的文件
# grep -r ‘energywise’ * #在当前目录及其子目录下搜索'energywise'行的文件
代码语言:javascript复制# grep -l -r ‘energywise’ * #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
这几个命令很使用,是查找文件的利器。
grep与正规表达式
字符类
字符类的搜索:如果我想要搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 't?st' 存在~这个时候,我可以这样来搜寻:
代码语言:javascript复制[root@www ~]# grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.
其实 [] 里面不论有几个字节,他都谨代表某『一个』字节, 所以,上面的例子说明了,我需要的字串是『tast』或『test』两个字串而已!
字符类的反向选择 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,如下
代码语言:javascript复制[root@www ~]# grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
第 2,3 行没有疑问,因为 foo 与 Foo 均可被接受!
但是第 18 行明明有 google 的 goo 啊~别忘记了,因为该行后面出现了 tool 的 too 啊!所以该行也被列出来~ 也就是说, 18 行里面虽然出现了我们所不要的项目 (goo) 但是由於有需要的项目 (too) , 因此,是符合字串搜寻的喔!
至於第 19 行,同样的,因为 goooooogle 里面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,这一行也是符合需求的!
字符类的连续:再来,假设我 oo 前面不想要有小写字节,所以,我可以这样写 [^abcd....z]oo , 但是这样似乎不怎么方便,由於小写字节的 ASCII 上编码的顺序是连续的, 因此,我们可以将之简化为底下这样:
代码语言:javascript复制[root@www ~]# grep -n '[^a-z]oo' regular_express.txt
3:Football game is not use feet only.
也就是说,当我们在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等等, 就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文呢? 呵呵!就将他全部写在一起,变成:[a-zA-Z0-9]。
我们要取得有数字的那一行,就这样:
代码语言:javascript复制[root@www ~]# grep -n '[0-9]' regular_express.txt
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.
行首与行尾字节 ^ $ 行首字符:如果我想要让 the 只在行首列出呢? 这个时候就得要使用定位字节了!我们可以这样做:
代码语言:javascript复制[root@www ~]# grep -n '^the' regular_express.txt
12:the symbol '*' is represented as start.
此时,就只剩下第 12 行,因为只有第 12 行的行首是 the 开头啊~此外, 如果我想要开头是小写字节的那一行就列出呢?可以这样:
代码语言:javascript复制[root@www ~]# grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as start.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.如果我不想要开头是英文字母,则可以是这样:
代码语言:javascript复制[root@www ~]# grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:# I am VBird
^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!
那如果我想要找出来,行尾结束为小数点 (.) 的那一行:
代码语言:javascript复制[root@www ~]# grep -n '.$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
11:This window is clear.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
17:I like dog.
18:google is the best tools for search keyword.
20:go! go! Let's go.
特别注意到,因为小数点具有其他意义(底下会介绍),所以必须要使用转义字符()来加以解除其特殊意义!
找出空白行:
代码语言:javascript复制[root@www ~]# grep -n '^$' regular_express.txt
22:
因为只有行首跟行尾 (^$),所以,这样就可以找出空白行啦!
任意一个字节 . 与重复字节 * 这两个符号在正则表达式的意义如下:
代码语言:javascript复制. (小数点):代表『一定有一个任意字节』的意思;
* (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态
假设我需要找出 g??d 的字串,亦即共有四个字节, 起头是 g 而结束是 d ,我可以这样做:
代码语言:javascript复制[root@www ~]# grep -n 'g..d' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
16:The world <Happy> is the same with "glad".
因为强调 g 与 d 之间一定要存在两个字节,因此,第 13 行的 god 与第 14 行的 gd 就不会被列出来啦!
如果我想要列出有 oo, ooo, oooo 等等的数据, 也就是说,至少要有两个(含) o 以上,该如何是好?
因为 * 代表的是『重复 0 个或多个前面的 RE 字符』的意义, 因此,『o*』代表的是:『拥有空字节或一个 o 以上的字节』,因此,『 grep -n 'o*' regular_express.txt 』将会把所有的数据都列印出来终端上!
当我们需要『至少两个 o 以上的字串』时,就需要 ooo* ,亦即是:
[root@www ~]# grep -n 'ooo*' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!
如果我想要字串开头与结尾都是 g,但是两个 g 之间仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等,那该如何?
代码语言:javascript复制[root@www ~]# grep -n 'goo*g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!如果我想要找出 g 开头与 g 结尾的行,当中的字符可有可无
代码语言:javascript复制[root@www ~]# grep -n 'g.*g' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
因为是代表 g 开头与 g 结尾,中间任意字节均可接受,所以,第 1, 14, 20 行是可接受的喔! 这个 .* 的 RE 表示任意字符是很常见的.
如果我想要找出『任意数字』的行?因为仅有数字,所以就成为:
代码语言:javascript复制[root@www ~]# grep -n '[0-9][0-9]*' regular_express.txt
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.限定连续 RE 字符范围 {}
我们可以利用 . 与 RE 字符及 * 来配置 0 个到无限多个重复字节, 那如果我想要限制一个范围区间内的重复字节数呢?
举例来说,我想要找出两个到五个 o 的连续字串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符 来让他失去特殊意义才行。 至於 {} 的语法是这样的,假设我要找到两个 o 的字串,可以是:
代码语言:javascript复制[root@www ~]# grep -n 'o{2}' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search ke
19:goooooogle yes!假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串,他会是这样:
代码语言:javascript复制[root@www ~]# grep -n 'go{2,5}g' regular_express.txt
18:google is the best tools for search keyword.
如果我想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:
代码语言:javascript复制[root@www ~]# grep -n 'go{2,}g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
扩展grep(grep -E 或者 egrep): 使用扩展grep的主要好处是增加了额外的正则表达式元字符集。
打印所有包含NW或EA的行。如果不是使用egrep,而是grep,将不会有结果查出。
代码语言:javascript复制 # egrep 'NW|EA' testfile
northwest NW Charles Main 3.0 .98 3 34
eastern EA TB Savage 4.4 .84 5 20对于标准grep,如果在扩展元字符前面加,grep会自动启用扩展选项-E。
代码语言:javascript复制#grep 'NW|EA' testfile
northwest NW Charles Main 3.0 .98 3 34
eastern EA TB Savage 4.4 .84 5 20搜索所有包含一个或多个3的行。
代码语言:javascript复制# egrep '3 ' testfile
# grep -E '3 ' testfile
# grep '3 ' testfile
#这3条命令将会
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
northeast NE AM Main Jr. 5.1 .94 3 13
central CT Ann Stephens 5.7 .94 5 13搜索所有包含0个或1个小数点字符的行。
代码语言:javascript复制# egrep '2.?[0-9]' testfile
# grep -E '2.?[0-9]' testfile
# grep '2.?[0-9]' testfile
#首先含有2字符,其后紧跟着0个或1个点,后面再是0和9之间的数字。
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
eastern EA TB Savage 4.4 .84 5 20搜索一个或者多个连续的no的行。
代码语言:javascript复制# egrep '(no) ' testfile
# grep -E '(no) ' testfile
# grep '(no) ' testfile #3个命令返回相同结果,
northwest NW Charles Main 3.0 .98 3 34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
不使用正则表达式
fgrep 查询速度比grep命令快,但是不够灵活:它只能找固定的文本,而不是规则表达式。
如果你想在一个文件或者输出中找到包含星号字符的行
代码语言:javascript复制fgrep '*' /etc/profile
for i in /etc/profile.d/*.sh ; do
或
grep -F '*' /etc/profile
grep使用案例
1.搜索和寻找文件
假设你已经在你的电脑上安装了一个全新的Ubuntu,然后你打算卸载Python。你浏览网页寻找教程,但是你发现存在两个不同版本的Python在使用,而你不知道你的Ubuntu安装器到底在你的系统中安装了哪个版本的Python,也不知道它安装了哪些模块。解决这个烦恼只需简单的运行以下命令:
$ sudo dpkg -l | grep -i python
输出例子
ii python2.7 2.7.3-0ubuntu3.4 Interactive high-level object-oriented language (version 2.7) ii python2.7-minimal 2.7.3-0ubuntu3.4 Minimal subset of the Python language (version 2.7) ii python-openssl 0.12-1ubuntu2.1 Python wrapper around the OpenSSL library ii python-pam 0.4.2-12.2ubuntu4 A Python interface to the PAM library
首先,我们运行dpkg -l列出你系统上安装的.deb包。接着,我们使用管道将输出结果传输给命令grep -i python,这一步可以简单解释为把结果传输给grep然后过滤出所有含有python的项,并返回结果。–i选项用于忽略大小写,因为 grep 是大小写敏感的。使用选项-i是个好习惯,除非你打算进行更细节的搜索。
2.搜索和过滤文件
grep还可以在一个或多个文件里用于搜索和过滤。让我们来看一个这样的情景:
你的Apache网页服务器出现了问题,你不得不从许多专业网站里找一个发帖询问。好心回复你的人让你粘贴上来你的/etc/apache2/sites-available/default-ssl文件内容。假如你能移除掉所有的注释行,那么对你,对帮你的人,以及所有阅读该文件的人,不是更容易发现问题吗?你当然可以很容易的做到!只需这样做就可以了:
$ sudo grep -v "#" /etc/apache2/sites-available/default-ssl
选项-v是告诉grep命令反转它的输出结果,意思就是不输出匹配的项,做相反的事,打印出所有不匹配的项。这个例子中,有#的是注释行(译注:其实这个命令并不准确,包含“#”的行不全是注释行。关于如何精确匹配注释行,可以了解更多的关于正则表达式的内容。)。
3.找出所有的mp3文件
grep命令对于过滤来自于标准输出的结果非常有用。例如,假设你的一个文件夹里面全是各种格式的音乐文件。你要找出艺术家jayZ的所有mp3格式的音乐文件,里面也不要有任何混合音轨。使用find命令再结合管道使用grep就可以完成这个魔法:
$ sudo find . -name ".mp3" | grep -i JayZ | grep -vi "remix""
在这个例子中,我们使用find命令打印出所有以.mp3为后缀名的文件,接着将其使用管道传递给grep -i过滤和打印出名字为“JayZ”的文件,再使用管道传送给grep -vi以便过滤掉含有“remix”的项。
4.在搜索字符串前面或者后面显示行号
另外两个选项是-A和-B之间的切换,是用以显示匹配的行以及行号,分别控制在字符串前或字符串后显示的行数。Man页给出了更加详细的解释,我发现一个记忆的小窍门:-A=after、-B=before。
sudo ifconfig | grep -A 4 etho sudo ifconfig | grep -B 2 UP
5.在匹配字符串周围打印出行号
grep命令的-C选项和例4中的很相似,不过打印的并不是在匹配字符串的前面或后面的行,而是打印出两个方向都匹配的行(译注:同上面的记忆窍门一样:-C=center,以此为中心): $ sudo ifconfig | grep -C 2 lo
6.计算匹配项的数目
这个功能类似于将grep输出的结果用管道传送给计数器(wc程序),grep内建的选项可以达到同样的目的:
$ sudo ifconfig | grep -c inet6
7.按给定字符串搜索文件中匹配的行号
当你在编译出错时需要调试时,grep命令的-n选项是个非常有用的功能。它能告诉你所搜索的内容在文件的哪一行:
$ sudo grep -n "main" setup.py
8.在所有目录里递归的搜索
假若你要在当前文件夹里搜索一个字符串,而当前文件夹里又有很多子目录,你可以指定一个-r选项以便于递归的搜索: $ sudo grep -r “function” *
9.进行精确匹配搜索
传递-w选项给grep命令可以在字符串中进行精确匹配搜索(译注:包含要搜索的单词,而不是通配)。例如,像下面这样输入:
$ sudo ifconfig | grep -w “RUNNING”
将打印出含有引号内匹配项的行。另外,你还可以试一下这个:
$ sudo ifconfig | grep -w “RUN”
搜索这个匹配项时,若搜索的东西里面没有这样的一个单独的单词,将什么也不会返回。
10.在Gzip压缩文件中搜索
我们还要关注一下grep的衍生应用。第一个是zgrep,这个与zcat很相似,可以用于gzip压缩过的文件。它有与grep相似的命令选项,使用方式也一样:
$ sudo zgrep -i error /var/log/syslog.2.gz
11.在文件中匹配正则表达式
egrep是另一个衍生应用,代表着“扩展全局正则表达式”。它可以识别更多的正则表达式元字符,例如at ? | 和()。在搜索源代码文件时,egrep是一个非常有用的工具,还有其他的一些零碎代码文件的搜索需要,使得这样的搜索能力成为必需。可以在grep命令中使用选项-E来启用它。
$ sudo grep -E
12.搜索一个固定匹配字符串
fgrep用于在一个文件或文件列表中搜索固定样式的字符串。功能与grep -F同。fgrep的一个通常用法为传递一个含有样式的文件给它:
$ sudo fgrep -f file_full_of_patterns.txt file_to_search.txt