Home > Mobile >  Linux Bash Print largest number in column from monthly rotated log file
Linux Bash Print largest number in column from monthly rotated log file

Time:01-19

I have monthly rotated log files which looks like the output below. The files are names transc-2301.log (transc-YMM). There is a file for each month of the year. I need a simple bash command to find the file of the current month, and display the largest number (max) of column 3. In the example below, the output should be 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

CodePudding user response:

Since your filenames are sortable you can easily pick the file of the current month as being the last one in a sortable sequence. Than a quick awk returns the result.

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

alternatively you can let awk do the heavy lifting on the filename

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

or if you don't like the glob-expansion trick:

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

CodePudding user response:

I would harness GNU AWK for this task following way, let transc-2301.log content be

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

then

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

gives output (as of 18 Jan 2023)

87

Warning: I assume your file use as separator two-or-more whitespace characters, if this does not hold adjust FS accordingly. Warning: set m to value which is lower than lowest value which might appear in column of interest. Explanation: I use strftime function to detect what file should be processed and ram all transc*.log files but action is only taken for selected file, action is: set m to $3 if it is higher than current m otherwise keep m value. After processing files, in END, I print value of m.

(tested ub GNU Awk 5.0.1)

CodePudding user response:

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

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