利用sed和awk从指定文件提取指定的行

2013-06-24

比如有一个日志文件很长,需要截取某几行的数据,用vi完成也行,就是会比较麻烦,这个时候看到了正则工具sed和awk,这两个工具对于文字处理很强大,最主要在于正则的使用,而只要使用它们的一些小小的功能,就可以完成提取几行内容的操作。

就sed而言,其语法大概是sed [option] [script] [file],因此使用起来也比较方便。

提取的方法是:

sed -n '3,5p' cache.log > log.1

其中3和5表示行数,可用^$和来表示头跟尾,而p代表了动作,也就是打印,其他动作可以参考man手册。这样就完成了提取3到5行内容的功能。

而awk比sed更进一步,因为其所处理的最小单元与sed 不同,sed以行为单位进行处理,而awk是通过空格或者tab分隔为最小单元,因此会与sed有些许不同。而对于awk的而言,一个例子是这样:

awk ' FNR >=3 && FNR <=5 {print $0}' < cache.log >log.1

这样的awk使用的功能同上面的sed功能是一样的,解释一下其中的一些可能有些特殊的地方,FNR是个内置变量,表示当前文件的行数,与此需要注 意区分的是NR,当处理单个文件是没有区别,而处理多文件时就不一样了,NR是所有文件的记录数,用来做统计比较不错,而FNR则是单个文件中的行数,最 大不会超过该文件的行数。另外$0表示一行的所有记录,而$1 $2 $3… 等表示了一行中的单元,其数字代表其序号,从左往右。(这样的话对于中东那边的话应该怎么处理?)

看了下《sed and awk》的介绍,感觉这个书值得一看,这两个工具的强大还是出乎我的意料之外了,如果能坚持的话还是学习一下,反正不会掉块肉。