结合awk和其他命令发送报告给用户
我需要使用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
你当然可以在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
非常感谢您的时间和这个解决方案dawg,不幸的是我必须用awk在shell脚本中编写它,因为我有一些限制。所以,如果你可以帮助我使用awk(我假设你对使用awk的shell脚本有足够的了解),那将会很棒,谢谢! – Vasu
我得到了解决,但其中存在一个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
我相信我不需要使用另一个awk变量(在这种情况下是dt),应该有其他方法来处理这个问题。 – Vasu
@Vasu现在您需要删除第一个注释以避免混淆错误和正确的内容.... –
我们需要看到'/ ccore/pbis/bin/enum-成员“adsusers”'确定如何将用户名映射到电子邮件地址。 –
用户对象[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