Linux Bash从每月轮换的日志文件中打印列中的最大数字



我有每月轮换的日志文件,看起来像下面的输出。文件名为transc-2301.log(transc YMM)。一年中每个月都有一个文件。我需要一个简单的bash命令来查找当前月份的文件,并显示第3列的最大数字(max)。在下面的例子中,输出应该是87

01/02/23 10:45  19      26
01/02/23 11:45  19      45
01/02/23 12:45  19      36
01/02/23 13:45  22      64
01/02/23 14:45  19      72
01/02/23 15:45  19      54
01/02/23 16:45  19      80
01/02/23 17:45  17      36
01/03/23 10:45  18      24
01/03/23 11:45  19      26
01/03/23 12:45  19      48
01/03/23 13:45  20      87
01/03/23 14:45  20      29
01/03/23 15:45  18      26

由于文件名是可排序的,因此您可以轻松地将当月的文件选为可排序序列中的最后一个。然后一个快速的awk返回结果。

for file in transc_*.log; do :; done
awk '($3>m){m=$3}END{print m}' "$file"

或者,你可以让awk在文件名上做繁重的工作

awk 'BEGIN{ARGV[1]=ARGV[ARGC-1];ARGC=2}($3>m){m=$3}END{print m}' transc_*.log

或者如果你不喜欢glob扩展技巧:

awk '($3>m){m=$3}END{print m}' "transc_$(date "+%y%m").log"

我会按照以下方式利用GNUAWK来完成这项任务,让transc-2301.log的内容是

01/02/23 10:45  19      26
01/02/23 11:45  19      45
01/02/23 12:45  19      36
01/02/23 13:45  22      64
01/02/23 14:45  19      72
01/02/23 15:45  19      54
01/02/23 16:45  19      80
01/02/23 17:45  17      36
01/03/23 10:45  18      24
01/03/23 11:45  19      26
01/03/23 12:45  19      48
01/03/23 13:45  20      87
01/03/23 14:45  20      29
01/03/23 15:45  18      26

然后

awk 'BEGIN{m=-1;FS="[[:space:]]{2,}";logname=strftime("transc-%y%m.log")}FILENAME==logname{m=$3>m?$3:m}END{print m}' transc*.log

给出输出(截至2023年1月18日)

87

警告:我假设您的文件使用两个或多个空白字符作为分隔符,如果这不适用,请相应地调整FS警告:将m设置为低于感兴趣列中可能出现的最低值的值。说明:我使用strftime函数来检测应该处理什么文件,并对所有transc*.log文件进行ram,但只对选定的文件执行操作,操作是:如果m高于当前m,则将其设置为$3,否则保持m的值。处理完文件后,在END中,I为mprint值。

(测试ub GNU Awk 5.0.1)

mawk '_<(__ = +$NF) { _=__ } END { print +_ }'

gawk 'END { print +_ } (_=_<(__=+$NF) ?__:_)<_' 
87

相关内容

  • 没有找到相关文章

最新更新