4

我正在尝试报告每个日期创建的文件数量。我可以用这个小班轮做到这一点:

ls -la foo*.bar|awk '{print $7, $6}'|sort|uniq -c

我得到一个列表,按日期创建了多少个 fooxxx.bar 文件,但月份的形式是:Aaa(即:Apr),我想要 xx(即:04)。

我感觉答案就在这里:

awk '
BEGIN{
   m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|")
   for(o=1;o<=m;o++){
      months[d[o]]=sprintf("%02d",o)
    }
format = "%m/%d/%Y %H:%M"
}
{
split($4,time,":")
date = (strftime("%Y") " " months[$2] " " $3 " " time[1] " " time[2] " 0")
print strftime(format, mktime(date))
}'

但是完全不知道我需要去掉什么,也不知道如何将 7 美元转移到我从中提取的任何东西上,以将 Apr 转换为 04。

谢谢!

4

5 回答 5

15

这是在 awk 中将缩写的月份名称转换为数字的惯用方法:

$ echo "Feb" | awk '{printf "%02d\n",(index("JanFebMarAprMayJunJulAugSepOctNovDec",$0)+2)/3}'
02

$ echo "May" | awk '{printf "%02d\n",(index("JanFebMarAprMayJunJulAugSepOctNovDec",$0)+2)/3}'
05

如果您需要更多信息来解决您的问题,请告诉我们。

于 2012-10-27T05:19:09.453 回答
1

假设月份的名称只出现在月份列中,那么你可以这样做:

ls -la foo*.bar|awk '{sub(/Jan/,"01");sub(/Feb/,"02");print $7, $6}'|sort|uniq -c
于 2012-10-26T20:04:37.717 回答
0

为了解析 AIX istat,我使用:

istat .profile | grep "^Last modified" | read dummy dummy dummy  mon day time dummy yr dummy
echo "M: $mon D: $day T: $time Y: $yr"
-> Month: Mar Day: 12 Time: 12:05:36 Year: 2012

为了解析 AIX istat 月份,我使用了这个两行 AIX 6.1 ksh 88:

monstr="???JanFebMarAprMayJunJulAugSepOctNovDec???"
mon="Oct" ; hugo=${monstr%${mon}*} ; hugolen=${#hugo} ; let hugol=hugolen/3 ; echo "Month: $hugol"
-> Month: 10

1..12 : 月份名称 ok

如果 lt 1 或 gt 12 :月份名称不正确

而不是“雨果”使用说话的名字;-))

于 2014-01-07T13:29:00.680 回答
0

只需使用您月份的字段编号作为months数组的索引。

print months[$6]

由于ls输出因系统而异,有时在同一系统上取决于文件年龄,并且您没有给出任何示例,因此我无法知道如何进一步指导您。

哦,不要解析ls.

于 2012-04-11T17:31:31.080 回答
0

为 AIX 添加一个版本,显示如何检索所有日期元素(在您需要它们的任何时区),并显示 iso8601 输出

tempTZ="UTC" ; TZ="$tempTZ" istat /path/to/somefile \
| grep modified \
| awk -v tmpTZ="$tempTZ" '
   BEGIN {Mmms="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"; 
          n=split(Mmms,Mmm," ") ; 
          for(i=1;i<=n;i++){ mm[Mmm[i]]=sprintf("%02d",i) } 
   }
         { printf("%s-%s-%sT%s %s",$NF, mm[$4], $5, $6, tmpTZ )  }
  ' ## this will output an iso8601 date of the modification date of that file, 
    ## for ex: 2019-04-18T14:16:05 UTC 
 ## you can tempTZ=anything, for ex: tempTZ="UTC+2" to see that date in UTC+2 timezone... or tempTZ="EST" , etc

我展示了 iso8601 版本以使其更加知名和使用,但当然您可能只需要“mm”部分,这很容易完成:mm[$4]

于 2021-03-04T11:39:48.767 回答