1) awk和sed的区别是什么?
两者都是转换文本的工具。但是awk除了操作文本之外还可以做更多的事情。它本身就是一种编程语言,包含了你在编程中学到的大部分东西,比如数组、循环、if/else流控制等等。你也可以在sed中“编程”,但是你不会想要维护用它写的代码。
2)哪种应用程序是sed和awk工具的最佳用例?
结论:使用sed进行非常简单的文本解析。除此之外,awk更好。事实上,您可以完全抛弃sed,只使用awk。因为它们的功能是重叠的,awk可以做的更多,所以使用awk就可以了。你也可以缩短你的学习曲线。
sed是一个流编辑器。它以每行为基础处理字符流。它有一个基本的编程语言,包括goto风格的循环和简单的条件语句(除了模式匹配和地址匹配)。本质上只有两个“变量”:模式空间和保持空间。脚本的可读性可能很困难。数学运算是极其笨拙的。
sed
sed有各种版本,它们对命令行选项和语言特性的支持程度各不相同。
awk面向每行分隔的字段。它有更健壮的编程结构,包括if/else, while, do/while和for (c风格和数组迭代)。它完全支持变量和一维关联数组以及(IMO)笨拙的多维数组。数学运算类似于c语言。它有printf和函数。“AWK”中的“K”代表“Kernighan”,就像《C编程语言》一书中的“Kernighan和Ritchie”一样(不要忘记if0ho和if1einberger)。可以想象使用awk编写学术剽窃检测器。
awk
if
else
while
do
for
printf
GNU awk (gawk)有许多扩展,包括最新版本中的真正的多维数组。还有awk的其他变体,包括mawk和nawk。
gawk
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来自动执行在文本编辑器中手动执行的任务。这就是为什么它被称为流编辑器。(您可以使用相同的命令在vim中编辑文本)。如果你想分析文本,计数字段,计算总数,提取和重组结构等,使用awk。
此外,你不应该忘记grep。如果你只想搜索/提取文本(文件)中的内容,请使用grep
grep