Awk的名字来源于它的开发人Aho,Weinberger和kernighan,这是一程序设计语言,非常适合结构化的处理和格式化报表的生成。
sed是一个“做交互式的”面向字符流的编辑器。它和很多UNIX程序一样,被认为是面向字符流的,这是因为输入流通过程序并将输出直接送到标准输出端。(例如,VI不是面向字符流的,大多数dos应用程序也不是)。sed还可以有效的用于编辑非常庞大的文件,而这个文件利用交互式编辑进行处理将会很慢。
awk典型的示例是将数据转换成格式化的报表。和sed脚本一样,awk脚本一般是利用shell包装器来调用。shell包装器是一个shell脚本,它通常包含调用awk的命令行以及awk解释的脚本。
使用sed,你必须了解一组单字母的命令。使用awk,你必须了解程序设计语言的语句。
sed和awk的共同点:都是面向字符流的,都是从文本文件中一次一行的读取输入,并将输出直接送到标准输出端;都使用正则表达式进行模式匹配;都允许用户在脚本中指定指令。
g/regular/s/regular/complex/g注意:“g”的含义,开始出的“g”是全局命令,意味着对所有与地址匹配的行进行改变。结尾处的“g”是一个标志,意味着改变一行上的每个出现,不只是第一个。如果地址和模式相同,那么可以通过指定两个连续的定界符(//)来告诉ed.但是sed命令隐式的全局命令。所以g/regular/s/regular/complex/g在sed中应该为/regular/s/regular/complex/g。
awk是作为可编程的编辑器而开发的,awk和sed不同的地方是它废弃了行编辑器的命令集,提供了仿效C语言的程序设计语言,awk提供了表达式、条件语句、循环和其他程序设计结构。
awk最独特的特征之一是它分析或拆分每个输入行,并生成可用于脚本处理的独立的单词。
command [options] script filename, script指定了要执行的指令。如果在命令行上script,假如它包含有可以有shell解释的空格或任意字符(例如$和*),那么它必须用单引号括起。
在sed和awk中,每个指令都包含两个部分:模式和过程。模式是由斜杆(/)分割的正则表达式。过程指定一个或多个将被执行的动作。
当所有可用指令被解释并应用于单个行后,sed输出该行并循环处理每个输出行。另一方面,awk不自动输出行,脚本中的指令控制awk最终所做的事情。在sed和awk中的过程的内容有很大的不同,在sed中,过程有类似于行编辑器中使用的那些编辑命令组成。大部分命令由单个字母组成。在awk中,过程有程序设计语句和函数组成。过程必须用大括号括起。
并不是在任何情况下都需要将指令用单括号包围起来,但是应该养成这个习惯。使用单引号可以阻止shell解释编辑指令中的特殊字符或空格。
在sed中,-e选项在有多个编辑命令时使用;-n选项可以阻止自动输出,只会显示受命令影响的行。
在通常情况下,awk将每个输入行解释为一条记录而将一行上的每个单词(由空格或制表符分割)解释为每一个字段。awk允许在模式或过程中引用这些字段。$0代表整个记录。awk程序更像一种查询语言,从文本中提取有用的信息。
不要将awk中的字段分隔符-F选项与指定脚本文件名的-f选项弄混。同时注意三点:用大括号({})将过程括起来,用单引号('')将指令括起来,用斜杠(//)将正则表达式括起来。
关于正则表达式部分参考awk and sed3精华版中的附录;其中比较特殊的两个字符需要注意:& 用正则表达式匹配的内容进行替换;\n 匹配第n个字串(n是一个数字),这个字串以前在pattern中用"\("和"\)"指定。
详细请参考:《awk and sed3精华版》
阅读(1562) | 评论(0) | 转发(0) |