现在我们来学习UNIX命令ls的几个脚本。下面的执行命令ls -l得到的一个长列表样本
$ ls -l这个列表是一个报告,其中的数据按行和列显示。每个文件信息显示在单独的一行上。文件列表由9个列组成。文件的操作权限出现在第一列,文件的字节数显示在第五列,文件名显示在最后一列。在列之间由一个或多个空格来分隔,我们可以将每个列看做是一个字段。
在第一个例子中,我们将这个命令的输出结果导入一个awk脚本中,该脚本打印出该文件列表中选定的字段。为了完成这项操作,我们将创建一个shell脚本使得能够将数据输送到用户。因此, shell程序的结构是:
#!/bin/bashshell使用$*变量来扩展通过命令行传递的所有变量(这里可以使用$1来传递第一个变量,但是传递所有的变量将具有更大的灵活性)。这些参数可能是文件名、目录或ls命令的附加选项。如果没有指定参数, "$*"将为空并且显示当前目录。因此ls命令的输出可以传给awk,即使没有给出文件名也能自动读取标准的输入。
我们希望awk脚本能够打印文件的大小和名字。即打印第五个字段($5)和第九个字段($9)。
ls -l $* | awk '{如果将上面的代码保存在文件fls中并运行该文件,则可以执行fls文件:
$ chmod +x fls以上程序所做的工作就是读入一个长列表并将其减少为两个字段。现在我们来产生报告,增加一些新的功能以产生一些信息,这是ls -l列表所没有提供的。我们将每个文件的大小相加,得到列表中所有文件的总字节数。我们还能够跟踪文件的数量并计算出总数。增加这些功能包括两部分。首先累计每个输入行。我们创建变量sum来累加列表中文件的大小,用变量filenum来累加列表中文件的数量。
ls -l $* | awk '{第一个表达式使用赋值操作符+=。它的功能是将第五个字段的值加到变量sum的当前值上。第二个表达式递增变量filenum的值。该变量作为一个计数器,每次表达式计算一次,计数器加1。