awk应用-获取文件的信息(二)


我们所编写的操作将应用于所有的输入行。当awk读入所有的输入行后,所产生的总数必须打印出来,因此,我们编写了一个由END规则控制的操作:

END { print "Total: ", sum, "bytes (" filenum " files)" }

我们还可以使用BEGIN 规则给报告增加列标题。

BEGIN { print "BYTES", "\t", "FILE" }

现在,我们将这些程序代码放在文件filesum中并作为一个命令运行。

$ ./filesum c*
BYTES FILE
882 ch01
1771 ch03
1987 ch04
6041 com.tmp
1778 combine.idx
Total: 12459 bytes (5 files

这个命令的优点是能够确定一个目录中文件的大小。在显示基本机制之后,还需要注意几个问题。第一个问题出现在当使用ls -l命令显示整个目录时,列表中包含一个指定目录中块的总数的行。在前面例子(所有以"c" 开头的文件)中的部分列表中没有包含这一行。但是如果整个目录都列出来,那么在输出中将会包含下面的一行:
total 555
我们对块总数并不感兴趣,因为程序显示了文件的总的大小。现在filesum没有打印这一行,但是它读入了这一行并使计数器filenum得到了递增。

这个脚本还有一个问题,也就是它如何处理子目录。参见下面ls -l 执行结果中的一行:

drwxrwxrwx 3 dale project 960 Feb 1 15:47 sed

第一列(文件的操作权限)中的首字符"d"表示该文件是子目录。文件的大小(960B)并不表示子目录下的文件的大小,因此,经常错误地把这个数加到文件总的大小上。因此,指出这是一个目录可能是有用的。

如果想列出子目录中的文件,可以在命令行中提供-R(递归)选项。该选项将传递给ls命令。然而,当它识别每个目录时,列表有一些区别。例如,要识别子目录old, ls -lR将产生一个空行,跟随:"./old"

我们前面的脚本忽咯了这行及其前面的空行,但是仍然递增文件计数器。幸运的是,我们可以设计规则来处理这类情况。我们来看下面修改后的、加了注释的脚本,请参照下一节的内容。

相关内容