我正在尝试查找每天的平均文件数。
以下脚本有效:
#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
printf "%s\t%d\n", date, freq[date]
}'
当我为 for 循环添加 do 和 done 时,如下所示:
#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
do
printf "%s\t%d\n", date, freq[date]
done
}'
我收到以下错误:
awk: cmd. line:8: done
awk: cmd. line:8: ^ syntax error
如何在awk命令的END块内编写多行for循环语句?
解决方案:
我们需要使用 { 和 } 在 awk 命令的 END 块中开始和结束 for 循环。
#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
{
count=count+1
total=total+freq[date];
printf "%s\t%d\n", date, freq[date]
}
printf "Average files per day : %d\n",(total/count)
}'
答案1
根本没有done
in语法,就像 一样。awk
do
do statement while (condition)
您需要使用大括号:
for (date in freq) { cmd1; cmd2; cmd3; }
答案2
请考虑,一般来说,解析ls
输出是有问题的。
看为什么你不应该解析 ls 的输出(加上链接页面)。
作为操作文件日期/时间的解决方案,您可以使用 GNU find
(如果可用)并使用 GNU 扩展,例如-printf "%T@"
获取UNIX 纪元时间或以易于解析的格式输出时间。 (检查man find
或在这里阅读
)。
--编辑:凯文指出这一点:
BSD find
(和其他实现)没有此功能。但可以使用stat
(如果存在)来获取相同的信息。检查一下人。
--编辑结束
例如,你可以这样做:
find . -maxdepth 1 -type f -printf "%TY%Tm%Td-%TH%TM%TS"
获取YYYYMMDD-HHMMSS
格式的修改时间。