sed 与 awk

  去图书馆借了一本书《sed&awk》,正好要坐火车,就带它上火车, 并且看了一下

  这本400多页的书,在火车上显然是看不完的,不过前面的几部分我仔细看了一下,觉得很适合入门,之前看sed与awk总觉得有些地方很别扭,这次倒是觉得,在这本书结合例题的情况下,显得很容易上手。

  正式开篇的的一段话:

  如果你正要开始学习sed与awk,最好从了解它们的共同点入手:

  • 它们都是使用相似的语法来调用
  • 它们都是面向字符流的,都是从文本文件中一次一行地读取输入,并将输出直接送到标准输出端
  • 它们都使用正则表达式进行模式匹配
  • 他们允许用户在脚本中指定指令

  我觉得这里,对我认识sed与awk最关键的一句话,就是“一次一行地读取输入,并将输出直接送到标准输出端”

  sed与awk之所以有这么多的共同点,原因之一是它们都起源于相同的行编辑器——ed

  于是文章先从介绍ed的命令模式开始,行编辑器,每次可以处理一行,这也是为什么sed与awk每次只处理一行,在ed上能用的命令,sed与awk都能调用,并且sed与awk的调用方式都可以归纳为:

command [options] script filename

  从而可以将sed与awk的命令脚本话,成为我们实用的小工具之一。

  后面开始,讲述一些正则表达式,其实对于正则表达式,我很久前就看过,但之前在wins下很少用,就忘了,现在再看,觉得只需要记得一些常用的就可以了,稍微了解一些复杂的规则,从而可以很方便的查询其匹配规则,当然关于正则表达式,一定要注意的,就是测试,看看自己是否有误。

  对于sed脚本的编写,编写脚本时一定要遵循以下的步骤:

  • 在着手做之前要弄清楚想做什么
  • 明确地描述处理的过程
  • 在提交最终的改变之前反复测试这个过程

  此外,要弄清楚sed工作的三个基本原理:

  • 脚本中的所有编辑命令都将一次应用于每个输入行
  • 命令应用于所有的行(全局的),除非行寻址限制了受编辑命令影响的行
  • 原始的输入文件未被改变,编辑命令修改了原始行的备份并且此备份被发送到标准输出

  这三个基本原理让我一下觉得sed的执行过程变得非常好理解了,这就相当于这样一个过程:

while(!EOF)
{
    row = getline() 读取一行
    row -> sedscr 用sed脚本处理这一行
    print 一般情况下, 打印处理结果
}

  一下就很好理解了,后面介绍的一些基本命令,就可以着手测试了,当然,我只看到基本的用法,高深的等需要的时候再看吧,不然也要忘记的。

  接下来就是awk的介绍,awk有很多经典的书介绍,其中包括《The AWK Programming Language》

  在我看来,awk很多时候跟sed是很相像的,除了需要一些特别的方式进行给出命令,但另外地,最主要的,AWK看起来更像是一个编程语言,比如,AWK里面有两个特殊测例程,它们在任何输入被读取之前和所有输入都被读取之后执行的:BEGIN 与 END。

  所以,一般情况下,把awk脚本看成3个主要部分组成:

  • 处理输入前将做的处理
  • 处理输入过程中将做的处理
  • 处理输入完成后做的处理

  有这些过程,awk看起来似乎更灵活,并且有着类似于基本C语言编程的特性,其实也很容易理解,至于后面的循环、条件、数组还有函数之类的,原理跟C差不太多,就不讲了。

  后面有一章内容,很有意思,叫做《底部抽屉》,开篇讲:本篇要证明并不是一切东西都有其特定的位置。不管怎样安排它们,有些东西看起来就是不合适。这章就是这些情况的一个汇总。考虑抽屉的主题结构,像内衣、袜子和其它每天都要用的东西放在抽屉的上部,而不经常用的东西放在底部抽屉,所有的这些东西看来都是同样可以获得的,但是你必须俯身去底部抽屉找东西。总之,需要更多的努力去得到底部抽屉的东西

  再往后,讲了一些awk的产品以及综合应用,有些应用过于复杂,我想我暂时只能勉强读一读,但有些问题比较简单,我打算尝试练习一下

  总之,《sed&awk》这本书很不错。

原文地址:https://www.cnblogs.com/moondark/p/2841974.html