我对Unix/Linux系统管理和文本处理中
grep
、awk
和sed
的作用有些困惑。简短定义:
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"
awk
和sed
与grep
完全不同。
awk
和sed
是文本处理器。它们不仅可以查找文本中的内容,还可以删除、添加和修改文本(以及更多)。awk
主要用于数据提取和报告。而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的用户。
Grep可以快速搜索文件中与指定内容匹配的行,还可以返回匹配行号、匹配数和文件名列表等简单信息。
Awk是一种完整的编程语言,围绕读取CSV格式文件、处理记录和可选地打印结果数据集而构建。它可以完成很多任务,但对于简单任务来说并不是最易使用的工具。
Sed在基于正则表达式进行文件修改时非常有用。它允许您轻松地匹配行的部分、进行修改并打印结果。相对于awk来说它的表现力更弱,但对于简单任务来说更易于使用。它有许多更复杂的操作符可供使用(我认为它甚至是图灵完全的),但通常情况下您不会使用这些功能。
我只想提一件事,有许多工具可以进行文本处理,例如:sort、cut、split、join、paste、comm、uniq、column、rev、tac、tr、nl、pr、head、tail......
它们非常方便,但你必须学习它们的选项等。
学习文本处理的一种懒惰方式(不是最佳方式)可能是:只学习grep、sed和awk。用这三个工具,你几乎可以解决99%的文本处理问题,而不需要记忆上述不同的命令和选项。:)
而且,如果你已经学习并使用了这三个工具,你就知道它们之间的区别。实际上,这里的差异意味着哪个工具擅长解决什么样的问题。
更懒惰的方法可能是学习一个脚本语言(如Python、Perl或Ruby),并使用它来进行所有的文本处理。