欢迎投稿

今日深度:

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

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


现在我们来学习UNIX命令ls的几个脚本。下面的执行命令ls -l得到的一个长列表样本

$ ls -l
-rw-rw-rw- 1 dale project 6041 Jan 1 12:31 com.tmp
-rwxrwxrwx 1 dale project 1778 Jan 1 11 :55 combine.idx
-rw-rw-rw- 1 dale project 1446 Feb 15 22:32 dang
-rwxrwxrwx 1 dale project 1202 Jan 2 23:06 format.idx

这个列表是一个报告,其中的数据按行和列显示。每个文件信息显示在单独的一行上。文件列表由9个列组成。文件的操作权限出现在第一列,文件的字节数显示在第五列,文件名显示在最后一列。在列之间由一个或多个空格来分隔,我们可以将每个列看做是一个字段。

在第一个例子中,我们将这个命令的输出结果导入一个awk脚本中,该脚本打印出该文件列表中选定的字段。为了完成这项操作,我们将创建一个shell脚本使得能够将数据输送到用户。因此, shell程序的结构是:

#!/bin/bash
ls -l $* | awk 'script'

shell使用$*变量来扩展通过命令行传递的所有变量(这里可以使用$1来传递第一个变量,但是传递所有的变量将具有更大的灵活性)。这些参数可能是文件名、目录或ls命令的附加选项。如果没有指定参数, "$*"将为空并且显示当前目录。因此ls命令的输出可以传给awk,即使没有给出文件名也能自动读取标准的输入。

我们希望awk脚本能够打印文件的大小和名字。即打印第五个字段($5)和第九个字段($9)。

ls -l $* | awk '{
print $5"\t"$9
}'

如果将上面的代码保存在文件fls中并运行该文件,则可以执行fls文件:

$ chmod +x fls
$ ./fls
6041 com.tmp
1778 combine.id
1446 dang
1202 format.idx

$ ./fls com*
6041 com.tmp
1778 combine.idx

以上程序所做的工作就是读入一个长列表并将其减少为两个字段。现在我们来产生报告,增加一些新的功能以产生一些信息,这是ls -l列表所没有提供的。我们将每个文件的大小相加,得到列表中所有文件的总字节数。我们还能够跟踪文件的数量并计算出总数。增加这些功能包括两部分。首先累计每个输入行。我们创建变量sum来累加列表中文件的大小,用变量filenum来累加列表中文件的数量。

ls -l $* | awk '{
sum += $5
++filenum
print $5"\t"$9
}'

第一个表达式使用赋值操作符+=。它的功能是将第五个字段的值加到变量sum的当前值上。第二个表达式递增变量filenum的值。该变量作为一个计数器,每次表达式计算一次,计数器加1。

www.htsjk.Com true http://www.htsjk.com/sybase/19790.html NewsArticle awk应用-获取文件的信息(一) 现在我们来学习UNIX命令ls的几个脚本。下面的执行命令ls -l得到的一个长列表样本 $ ls -l -rw-rw-rw- 1 dale project 6041 Jan 1 12:31 com.tmp -rwxrwxrwx 1 dale project 1778 J...
评论暂时关闭