使用 vi 如何以简单有条理的方式来重复处理档案中的资料,并在不更动原档案的情况下,将这些数据存放到新档案中?
严格说来,这样的处理作业,应该选择像sed、awk这样的工具,在处理效率上比较好;如果处理需求单纯的话,grep 也足以应付。但那样的选择,通常是在处理流程已经相当成熟,且有必要经常性的重复使用之下才会做出。在突发性且处理模式尚未理清前,使用 vi 是较具弹性的选择。
我以一个整理httpd access_log来作说明。
某日凌晨,我刚好在主机上做测试,当时的网络有点忙,我用 netstat -ct 看了一会儿网络的状况,知道目前 httpd 有几位访客。一时兴起想看看他们来看什么,于是我使用 vi 去看了一下 Apache 的 access_log,意外地发现,同一时间,我的同胞 202.102.141.XX(为保护当事人的隐私起见,编者此处进行过处理) 正在扫描主机的 httpd server。再观察一下 netstat -ct 的讯息,我发觉他还没有完全做完。心想不应该打断人家的工作。当时人已经有点困了,所以我退出了 vi 并赶紧继续做我的事情。不久,周公他老人家就来抓我出公差,做他最近经营的 playboy 网站。虚拟实境的哦,采用会员制,非十八岁以下的梦遗才俊不收,我只有做苦工的份,没资格加入。
隔日自然醒来,打开计算机,先来上一段 Queen 的《We are the champions》加上一杯咖啡,突然想起凌晨未完成的观察,马上用 vi 再查看 access_log。乖乖!不是一个,前后共三位青年才俊上网。此时在 vi 模式下,我想分别将三位的数据从 access_log 档案中分离出来,建立三个个别档案。这种想法,以前不曾想过!一时卡住了,不知道该怎么做?拿起笔来,在纸上写下了"如何挪移"这几个字。喝完我的咖啡后,趴在桌上小眯一下..才一下,就被周公槌醒,我看着"挪移"两字,方法找到了。
# vi access_log
我使用 vi 指令进入了要编辑的 access_log 档案中。因为没有加上任何特殊选项,所以光标会在第一行的位置。接着,我打算将有为青年一号,地址是 202.102.141.XX,所遗留的拜访纪录全部挪移到档案的最末端。指令如下: