grep、awk和sed有什么区别?

147
我对Unix/Linux系统管理和文本处理中grepawksed的作用有些困惑。
3个回答

205

简短定义:

grep: 在文件中搜索特定项

#usage
$ grep This file.txt
Every line containing "This"
Every line containing "This"
Every line containing "This"
Every line containing "This"

$ cat file.txt
Every line containing "This"
Every line containing "This"
Every line containing "That"
Every line containing "This"
Every line containing "This"

现在,awksedgrep完全不同。 awksed是文本处理器。它们不仅可以查找文本中的内容,还可以删除、添加和修改文本(以及更多)。
awk主要用于数据提取和报告。而sed是一个流编辑器。 它们各有自己的功能和特长。
示例:
Sed
$ sed -i 's/cat/dog/' file.txt
# this will replace any occurrence of the characters 'cat' by 'dog'

Awk

$ awk '{print $2}' file.txt
# this will print the second column of file.txt

基本的 awk 使用方法:
计算总和/平均值/最大值/最小值等任何你需要的内容。

$ cat file.txt
A 10
B 20
C 60
$ awk 'BEGIN {sum=0; count=0; OFS="\t"} {sum+=$2; count++} END {print "Average:", sum/count}' file.txt
Average:    30

我建议你阅读这本书:Sed & Awk: 2nd Ed.

它将帮助你成为任何类Unix环境下熟练使用sed/awk的用户。


65

Grep可以快速搜索文件中与指定内容匹配的行,还可以返回匹配行号、匹配数和文件名列表等简单信息。

Awk是一种完整的编程语言,围绕读取CSV格式文件、处理记录和可选地打印结果数据集而构建。它可以完成很多任务,但对于简单任务来说并不是最易使用的工具。

Sed在基于正则表达式进行文件修改时非常有用。它允许您轻松地匹配行的部分、进行修改并打印结果。相对于awk来说它的表现力更弱,但对于简单任务来说更易于使用。它有许多更复杂的操作符可供使用(我认为它甚至是图灵完全的),但通常情况下您不会使用这些功能。


1
使用AWK在文件中搜索行与使用Grep一样快。这是第一个在此描述的情况:grep vs awk : 10 examples of pattern search (theunixschool) - Hibou57

35

我只想提一件事,有许多工具可以进行文本处理,例如:sort、cut、split、join、paste、comm、uniq、column、rev、tac、tr、nl、pr、head、tail......

它们非常方便,但你必须学习它们的选项等。

学习文本处理的一种懒惰方式(不是最佳方式)可能是:只学习grep、sed和awk。用这三个工具,你几乎可以解决99%的文本处理问题,而不需要记忆上述不同的命令和选项。:)

而且,如果你已经学习并使用了这三个工具,你就知道它们之间的区别。实际上,这里的差异意味着哪个工具擅长解决什么样的问题。

更懒惰的方法可能是学习一个脚本语言(如Python、Perl或Ruby),并使用它来进行所有的文本处理。


4
根据除了模式匹配之外的工作复杂度而定。如果除了模式匹配之外还有很多逻辑,Python 将是更好的选择;如果周围的逻辑更简单,则使用 SEd/Grep/AWK 更合适。 - Hibou57
2
实际上,按照这种推理方式,你可以建议只学习和使用awk,因为它可以完成sed和grep的大部分功能。 - Pablo Lalloni
这不应该是一个答案,因为它没有回答OP的问题。 - PKU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接