请解释一下这里写的是什么:awk

时间:2015-12-06 21:15:00

标签: bash awk

一般情况下它应该是这样的:找到作业文件夹中超过30天的所有内部版本,如果其数量大于30,则删除版本。 (此处不包括删除)。我只是在关于awk语句:vRS,vORS选项,这里的数组语句和asort函数。它在这里如何运作?

find -type d -name "builds" -mtime +30 -printf "%T@ %p\0" |\
awk -vRS="\0" -vORS="\0" '{match($0,/([^ ]* )(.*)/,a);b[a[2]]=a[1];c[a[1]]=a[2]}END{x=asort(b);for(i=x-30;i>0;i--)print c[b[i]]}' |\

1 个答案:

答案 0 :(得分:3)

详细信息

选项-vRS="\0"可以分为-v RS="\0"并将变量RS(输入记录分隔符)设置为表示空字节的值"\0",因此输入记录由null,与-printf的{​​{1}}输出一致。同样,输出记录分隔符ORS由find设置为null,而不是更正常的换行符。

GNU -vORS="\0"手册解释了time directivestime formats; find表示自The Epoch以来以秒为单位打印文件的修改时间,-T@表示打印文件的路径名。因此,输入是时间戳和构建时间的列表。

%p操作将输入记录拆分为数组match()中的两个字段 - 时间和名称。出于多种目的,a写得更好a[1],而$1写得更好a[2]。但是,如图所示编写它的原因是处理文件名中的空白等。数组$2以路径名索引的时间结束;数组b以时间索引的路径名结束。

GNU Awk asort()函数对数组c进行原位排序(给定一个参数 - 还有其他方法可以调用它),使用从1开始的整数下标重新索引数组,然后返回数组中的行数。最后的循环然后打印最旧的构建记录,留下30个未打印的名称(因为b)。因此,它生成除了最近发送到其输入的30个构建之外的所有构建。如果周围没有足够的旧版本,它将不会列出任何内容。

摘要

总而言之,该脚本生成了一个超过30天的所有构建的列表,除了最近30个超过30天的构建。输出中的名称由空字节分隔。