首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Linux 文本工具简化数据的提取(3)fgrep与egrep

使用 Linux 文本工具简化数据的提取(3)fgrep与egrep

fgrepfgrep 会对文件搜索某个字符串,并打印包含这个字符串的所有行的内容。与 grep 不同的是,fgrep 搜索的是一个字符串,而不是可以匹配某个表达式的一种模式。fgrep 可以看作是 grep 在以下方面进行了增强:
  • 一次可以搜索多个对象。
  • fgrep 工具通常速度都比 grep 更快。
  • 我们不能使用 fgrep 来搜索使用模式的正则表达式。
假设我们希望从前面的 memo 文件中提取全部由大写字母组成的名字。为了查找 “STEPHEN” 和 “BRIAN”,我们需要执行两个单独的 grep 命令,如下所示:
1
2
3
4
5
# grep STEPHEN memo
3. STEPHEN FLEMING

# grep BRIAN memo
6. BRIAN LARA




使用 fgrep,只需要一个命令就可以实现相同的任务:
1
2
3
4
# fgrep "STEPHEN
> BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA




注意在这两项之间需要使用回车符号。如果没有这个回车符号,搜索就变成了查找一行中的 “STEPHEN BRIAN”。有了这个回车符号之后,它就会查找 “STEPHEN” 的匹配项,以及匹配 “BRIAN” 的项。
还要注意在目标文本两侧必须要放上引号。这样可以将文本与文件名区分开来。
除了在命令行上指定搜索项之外,我们也可以将它们放到一个文件中,并使用这个文件的内容来搜索其他文件。-f 选项让我们可以指定一个包含搜索项的主文件,其中可以列出经常搜索的内容。
举例来说,我们可以想像一个名为 “search_items” 的文件,其中包含了我们希望搜索的两项内容:
1
2
3
# cat search_items
STEPHEN
BRIAN




下面的命令在前面的 memo 文件中搜索 “STEPHEN” 和 “BRIAN”:
1
2
3
# fgrep -f search_items memo
3. STEPHEN FLEMING
6. BRIAN LARA




egrepegrep 是 grep 的一个功能更加强大的版本,它让我们可以一次搜索多个对象。要搜索的对象是使用回车符(与 fgrep 一样)或管道符(|)来分隔的。
1
2
3
4
5
6
7
8
# egrep "STEPHEN
> BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA

# egrep "STEPHEN | BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA




上面这两个命令都可以完成相同的工作。
除了搜索多个目标的功能之外,egrep 还提供了重复搜索和分组搜索的功能:
  • ? 查找问号前面字符的零次匹配或一次匹配。
  • + 查找加号前面字符的一次或多次匹配。
  • ( ) 表示一个分组。
例如,假设您不记得 Brian 的姓是 “Lara” 还是 “Laras”。
1
2
# egrep "LARAS?" memo
6. BRIAN LARA




这次搜索会输出同时匹配 “LARA” 和 “LARAS” 的项。下面的搜索稍微有些不同:
1
2
# egrep "STEPHEN+" memo
3. STEPHEN FLEMING




它可以与 “STEPHEN”、“STEPHENN”、“STEPHENNN” 等匹配。
如果您正在查找一个单词加上它的一个派生词,可以在圆括号中包含派生词的标志字符。
1
2
3
4
# egrep -i "electron(ic)?s" memo
Sachin Tendulkar, who joins us from XYZ Consumer
Electronics as a national account manager covering
traditional mass merchants.




这会查找可以匹配 “electrons” 的项和可以匹配 “electronics” 的项。
总结一下:
  • + 号后面的正则表达式可以匹配这个正则表达式的一次或多次出现。
  • ? 号后面的正则表达式可以匹配这个正则表达式的零次或一次出现。
  • 使用 | 符号或回车符分隔开的正则表达式会返回可以与任意一个表达式匹配的字符串。
  • 正则表达式可以放到圆括号  ( ) 中进行分组。
  • 我们可以使用的命令行参数包括 -c、-f、-i、-l、-n 和 -v。
返回列表