我试图创建awk程序以添加最后一列数据(连接用户的时间),同时使格式仍然可读(小时数不超过24,分钟数不超过60。)但是第一行-不显示时间,生病时必须忽略它。
jms68988 pts/0 161.6.5.14 Fri Mar 22 08:41 still logged in
jms68988 pts/4 ip143-84.snl.wku Wed Mar 20 10:15 - 11:14 (00:58)
jms68988 pts/0 161.6.5.14 Wed Mar 20 09:59 - 07:44 (1+21:45)
jms68988 pts/0 161.6.5.14 Wed Mar 20 09:18 - 09:30 (00:11)
jms68988 pts/3 ip143-84.snl.wku Mon Mar 18 10:18 - 11:13 (00:55)
jms68988 pts/6 ip143-84.snl.wku Fri Mar 15 10:15 - 11:14 (00:59)
jms68988 pts/6 ip143-84.snl.wku Wed Mar 13 10:16 - 11:13 (00:57)
jms68988 pts/1 161.6.5.14 Wed Mar 13 10:05 - 07:47 (4+21:41)
jms68988 pts/0 161.6.5.14 Fri Jan 25 12:42 - 07:57 (2+19:14)
jms68988 pts/7 ip143-84.snl.wku Fri Jan 25 10:28 - 11:16 (00:47)
jms68988 pts/0 161.6.5.14 Fri Jan 25 08:33 - 08:35 (00:01)
你能用awk做这样的事情吗?
您可以在-中做很多类似的事情awk
-需要考虑两个基本方面:
第一个(记录选择)是通过在每一行上查找特定的正则表达式来完成的,下面的代码为您的输入数据选择最可能的情况,特别是最后一个字段匹配:
(<days>+<hours>:<minutes>)
其中<days>+
可选,三个字段为数字,并且字段后面有可选空格。这样会丢掉第一行,最后一行是in
。显然,如果您的数据可以采用不同的形式,则需要对此进行调整。
第二步(记录处理)涉及计算由所选每个记录的最终字段表示的实际时间。您可以通过将字符串分成三个部分,将它们转换为通用的基础值(分钟,每天1440分钟,每小时60分钟),然后在整个选定记录集中累积该值来实现。
然后,最后将这些分钟转换回几天,几小时和几分钟,然后输出结果。
这是一个执行此操作的awk
脚本prog.awk
:
/\(([0-9]+\+)?[0-9]+:[0-9]+\) *$/ {
# Split field on ALL puctuation, this puts empty string
# on either side, so one of:
# 1 2 3 4 5
# <empty> ( <days> + <hours> : <minutes> ) <empty>
# <empty> ( <hours> : <minutes> ) <empty>
# Once we know which one it is, we just extract to the
# correct variables.
sz = split($NF, tmArray, /[()+:]/)
if (sz == 5) {
dd = tmArray[2] + 0
hh = tmArray[3] + 0
mm = tmArray[4] + 0
} else {
dd = 0
hh = tmArray[2] + 0
mm = tmArray[3] + 0
}
# Output line for debugging.
printf "%3dd %3dh %3dm %s\n", dd, hh, mm, $NF
# Accumulate minutes.
total += dd * 1440 + hh * 60 + mm
}
END {
# After all records, convert minutes back to
# dd/hh/mm and print.
dd = int(total / 1440)
left = total % 1440
hh = int(left / 60)
mm = left % 60
printf "=====\n%3dd %3dh %3dm (from %dm)\n", dd, hh, mm, total
}
value = something + 0
顺便说一句,如果您担心我对诸如之类的代码的理智,这只是一种强制awk
将变量视为数字值而不是字符串的方法。
在输入数据上运行时,prog.input
可以看到结果:
pax> awk -f prog.awk prog.input
0d 0h 58m (00:58)
1d 21h 45m (1+21:45)
0d 0h 11m (00:11)
0d 0h 55m (00:55)
0d 0h 59m (00:59)
0d 0h 57m (00:57)
4d 21h 41m (4+21:41)
2d 19h 14m (2+19:14)
0d 0h 47m (00:47)
0d 0h 1m (00:01)
=====
9d 19h 28m (from 14128m)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句