2017-07-17 86 views
-1

我需要使用awk与Unix shell脚本相关的小帮助。 我有一个文件,如下所示:结合awk和其他命令发送报告给用户

139341 8.61248 python_dev ntoma2 r 07/17/2017 07:27:43 [email protected] 1 
139342 8.61248 python_val ntoma2 r 07/17/2017 07:27:48 [email protected] 1 
139652 8.61248 python_dev ntoma2 r 07/17/2017 10:55:57 [email protected] 1 

这是空间分隔。我需要获得第一栏和第四栏,它们是基于第六栏(日期为日期 - 日/月/年)的job-id和用户名(本例中为ntoma2),大于7天。比较第6列和当前日期,我需要获得比7天更早的列。

下面我有一个拿到7天以上的作业ID和用户名:

cat filename.txt | awk -v dt="$(date "--date=$(date) -7 day" +%m/%d/%Y)" -F" " '/qw/{ if($6<dt) print $4,":",$1 }' >> ./longRunningJob.$$ 

而且我还有一个命令来获取电子邮件ID,如下面使用的用户名(从上面的第4列) :

/ccore/pbis/bin/enum-members "adsusers" | grep ^UNIX -B3 | grep <User-Name> -B2 | grep UPN | awk '{print $2}' 

我需要结合上述2级的命令和需要将报告发送到每一个用户如象下面这样:

echo "Hello <User Name>, There is a long running job which is of job-id: <job-id> more than 7days, so please kill the job or let us know if we can help. Thank you!" | mailx -s "Long Running Job" 

注意:如果用户名重复,则所有列表都应放在一封电子邮件中。

我不知道如何结合这两个并发送电子邮件给用户,有人可以帮我吗?

预先感谢您! Vasu

+0

@Vasu现在您需要删除第一个注释以避免混淆错误和正确的内容.... –

+0

我们需要看到'/ ccore/pbis/bin/enum-成员“adsusers”'确定如何将用户名映射到电子邮件地址。 –

+0

用户对象[001](XXXXXXXX)\ n ============ \ n 启用:\ n 分辨名称:\ n SAM帐户名:\ n NetBIOS域名:\ n UPN:email @ FINCO。COM \ n 显示名称:\ n 别名:用户名\ n UNIX名称:\ n GECOS:\ n 壳牌:\ n 主目录:\ n 的Windows主目录:\ n 本地的Windows Home目录:\ n UID:\ n 主组SID:\ n 主要GID:\ n 密码过期:\ n 密码永不过期:在下次登录\ n 更改密码:\ n 用户可以更改密码: \ n 帐户被禁用:\ n 已过期帐户:\ n 帐户被锁定:\ n – Vasu

回答

0

你当然可以在awk中做到这一点 - 由于日期的支持,在gawk中更容易。

只给你如何做到这一点的轮廓,我在Ruby中写道的:

$ cat file 
139341 8.61248 python_dev ntoma2 r 07/10/2017 07:27:43 [email protected] 1 
139342 8.61248 python_val ntoma2 r 07/09/2017 07:27:48 [email protected] 1 
139652 8.61248 python_dev ntoma2 r 07/17/2017 10:55:57 [email protected] 1 

$ ruby -lane 'BEGIN{ require "date" 
        jobs=Hash.new { |h,k| h[k]=[] } 
        users=Hash.new() 
        pn=7.0 
      } 
      t=DateTime.parse("%s %s" % [$F[5].split("/").rotate(-1).join("-"), $F[6]]) 
      ti_days=(DateTime.now-t).to_f 
      ts="%d days, %d hours, %d minutes and %d seconds" % [60,60,24] 
        .reduce([ti_days*86400]) { |m,o| m.unshift(m.shift.divmod(o)).flatten } 
      users[$F[3]]=$F[7] 
      jobs[$F[3]] << "Job: %s has been running %s" % [$F[0], ts] if (DateTime.now-t).to_f > pn 
      END{ 
       jobs.map { |id, v| 
        w1,w2=["is a","job"] 
        w1,w2=["are","jobs"] if v.length>1 
        s="Hello #{id}, There #{w1} long running #{w2} running more than the policy of #{pn.to_i} days. Please kill the #{w2} or let us know if we can help. Thank you!\n\t" << v.join("\n\t") 
        puts "#{users[id]} \n#{s}" 
        # s is the formated email address and body. You take it from here... 

       } 
      } 

' /tmp/file 
[email protected] 
Hello ntoma2, There are long running jobs running more than the policy of 7 days. Please kill the jobs or let us know if we can help. Thank you! 
    Job: 139341 has been running 11 days, 9 hours, 28 minutes and 44 seconds 
    Job: 139342 has been running 12 days, 9 hours, 28 minutes and 39 seconds 
+0

非常感谢您的时间和这个解决方案dawg,不幸的是我必须用awk在shell脚本中编写它,因为我有一些限制。所以,如果你可以帮助我使用awk(我假设你对使用awk的shell脚本有足够的了解),那将会很棒,谢谢! – Vasu

0

我得到了解决,但其中存在一个bug,这里是解决方案:

!#/bin/bash 

{ qstat -u \*; /ccore/pbis/bin/enum-members "adsusers"; } | awk -v dt=$(date "--date=$(date) -7 day" +%m/%d/%Y) ' 
/^User obj/  { 
        F2 = 1 
        FS = ":" 
        T1 = T2 = "" 
        next 
       } 
!F2    { 
        if (NR < 3) next 
        if ($5 ~ "qw" && $6 < dt) JID[$4] = $1 "," JID[$4] 
        next 
       } 

/^UPN/   {T1 = $2 
       } 
/^Display/  {T2 = $2 
       } 
/^Alias/  {gsub (/ /, _, $2) 
        EM[$2] = T1 
        DN[$2] = T2 
       } 
END    {for (j in JID) {print "echo -e \"Hello " DN[j] " \\n \\nJob(s) with job id(s): " JID[j] " executing more than last 7 days, hence request you to take action, else job(s) will be killed in another 1 day \\n \\n Thank you.\" | mailx -s \"Long running job for user: " DN[j] " (" j ") and Job ID(s): " JID[j] "\" " EM[j] 
           } 
       } 
' | sh 

上述代码中的错误是 - 日期比较的if条件(如下所示)不能按预期工作,我真的不知道如何比较$ 6和变量dt(两种格式的mm月/日/年)。我想我应该使用mkdate()或其他东西。有人可以帮忙吗?

if ($5 ~ "qw" && $6 < dt) 

谢谢! Vasu

+0

我相信我不需要使用另一个awk变量(在这种情况下是dt),应该有其他方法来处理这个问题。 – Vasu