我需要一些帮助来启动和运行脚本。基本上,我有一些来自命令输出的数据,并希望选择其中的一些并进行评估
示例数据为
JSnow <jsnow@email.com> John Snow spotted 30/1/2015
BBaggins <bbaggins@email.com> Bilbo Baggins spotted 20/03/2015
Batman <batman@email.com> Batman spotted 09/09/2015
到目前为止,我有一些类似的东西
# Define date to check
check=$(date -d "-90 days" "+%Y/%m/%d")
# Return user name
for user in $(command | awk '{print $1}')
do
# Return last logon date
$lastdate=(command | awk '{for(i=1;i<=NF;i++) if ($i==spotted) $(i+1)}')
# Evaluation date again current -90days
if $lastdate < $check; then
printf "$user not logged on for ages"
fi
done
我有几个问题,尤其是虽然我可以从我不知道如何将它们放在一起的地方获取信息!我也猜我的日期评估会更复杂,但在这一点上这是另一个问题,只是为了更好地了解我的意图。如果有人能解释实现我的目标所需的逻辑步骤,并提出一个解决方案,那就太好了。谢谢
每次你在 shell 中编写一个循环只是为了操作文本时,你都有错误的方法(例如,参见 https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)。每个 UNIX 安装附带的通用文本操作工具都是 awk。这使用 GNU awk 作为时间函数:
$ cat tst.awk
BEGIN { check = systime() - (90 * 24 * 60 * 60) }
{
user = $1
date = gensub(/([0-9]+)/([0-9]+)/([0-9]+)/,"\3 \2 \1 0 0 0",1,$NF)
secs = mktime(date)
if (secs < check) {
printf "%s not logged in for agesn", user
}
}
$ cat file
JSnow <jsnow@email.com> John Snow spotted 30/1/2015
BBaggins <bbaggins@email.com> Bilbo Baggins spotted 20/03/2015
Batman <batman@email.com> Batman spotted 09/09/2015
$ cat file | awk -f tst.awk
JSnow not logged in for ages
BBaggins not logged in for ages
Batman not logged in for ages
将cat file
替换为 command
。