【发布时间】:2010-12-10 13:36:24
【问题描述】:
- awk 有什么区别 和 sed 吗?
- 最好使用什么样的应用程序 sed 和 awk 工具的案例?
【问题讨论】:
-
有关 unix.stackexchange 的相关 QA:Is there a basic tutorial for grep, awk and sed?
【问题讨论】:
1) awk 和 sed 有什么区别?
两者都是转换文本的工具。但是 awk 除了操作文本之外还可以做更多的事情。它本身就是一种编程语言,包含你在编程中学到的大部分东西,比如数组、循环、if/else 流控制等你也可以在 sed 中“编程”,但你不想维护用它编写的代码.
2) 什么样的应用程序是 sed 和 awk 工具的最佳用例?
结论:使用 sed 进行非常简单的文本解析。除此之外,awk 更好。事实上,你可以完全放弃 sed 而只使用 awk。由于它们的功能重叠并且 awk 可以做更多的事情,所以只需使用 awk。您也会减少学习曲线。
【讨论】:
sed, 's/search/replace' 比 awk 的语法更容易输入,并且是您大部分时间需要的。
sed 是一个流编辑器。它以每行为基础处理字符流。它有一种原始的编程语言,包括 goto 样式的循环和简单的条件(除了模式匹配和地址匹配)。本质上只有两个“变量”:模式空间和保持空间。脚本的可读性可能很困难。数学运算充其量是非常尴尬的。
sed 有多种版本,对命令行选项和语言功能的支持程度不同。
awk 面向以每行为基础的分隔字段。它具有更强大的编程结构,包括if/else、while、do/while 和for(C 风格和数组迭代)。完全支持变量和单维关联数组以及 (IMO) kludgey 多维数组。数学运算类似于 C 中的运算。它具有printf 和函数。 “AWK”中的“K”代表“Kernighan”,就像“C Programming Language”一书的“Kernighan and Ritchie”一样(不要忘记Aho和 Weinberger)。可以想象,使用awk 编写学术抄袭检测器。
GNU awk (gawk) 有许多扩展,包括最新版本中的真正多维数组。 awk 还有其他变体,包括mawk 和nawk。
两个程序都使用正则表达式来选择和处理文本。
我倾向于在文本中有模式的地方使用sed。例如,您可以用“会计括号”形式(例如“(231.45)”)替换某些文本中“减号后跟数字序列”(例如“-231.45”)形式的所有负数) 使用这个(有改进的余地):
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
当文本看起来更像行和列时,或者awk 将它们称为“记录”和“字段”时,我会使用awk。如果我要执行与上述类似的操作,但仅在简单的逗号分隔文件中的第三个字段上,我可能会执行以下操作:
awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile
当然,这些只是非常简单的示例,并不能说明每个示例必须提供的全部功能。
【讨论】:
sed界限的例子:sed.sourceforge.net/#scripts
这两种工具都用于处理文本,并且两种工具都可以用于某些任务。
对我来说,将它们分开的规则是:使用sed 自动执行您在文本编辑器中手动执行的任务。这就是为什么它被称为流editor。 (您可以使用相同的命令在 vim 中编辑文本)。如果您想分析文本、计算字段含义、计算总计、提取和重组结构等,请使用 awk。
你也不应该忘记grep。如果您只想搜索/提取文本(文件)中的某些内容,请使用 grep
【讨论】: