我有每月轮换的日志文件,看起来像下面的输出。文件名为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为m
的print
值。
(测试ub GNU Awk 5.0.1)
mawk '_<(__ = +$NF) { _=__ } END { print +_ }'
gawk 'END { print +_ } (_=_<(__=+$NF) ?__:_)<_'
87