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

ih99xse1  于 2023-01-21  发布在  Shell
关注(0)|答案(3)|浏览(112)

我有每月轮换的日志文件,如下所示。这些文件的名称为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
5vf7fwbs

5vf7fwbs1#

因为你的文件名是可排序的,你可以很容易地把当月的文件作为可排序序列中的最后一个,然后快速的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

或者如果你不喜欢全局扩展的技巧

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

j8yoct9x2#

我将按照以下方式利用GNU AWK完成此任务,让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函数检测应处理的文件,并RAM所有transc*.log文件,但仅对选定文件采取操作,操作为:如果m高于当前m,则将m设置为$3,否则保持m值。处理文件后,在END中,I mprint值。

  • (在GNU Awk 5.0.1下测试)*
hgqdbh6s

hgqdbh6s3#

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

相关问题