提取文本并在 bash 中进行评估



我需要一些帮助来启动和运行脚本。基本上,我有一些来自命令输出的数据,并希望选择其中的一些并进行评估

示例数据为

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

最新更新