如何从日志中获取最大值

如何从日志中获取最大值

我有日志文件,其中显示十个值,最后一列值是以字节为单位的内存。如果我想显示过去四天使用的最高内存,我应该使用什么命令或脚本?在curlor命令的帮助下,awk如何获取最近四天使用的最大内存值?

日志文件的名称是ansh.log,它包含以下内容:

 Timestamp ,xyz=1, abc=2, def=6 ,memory=64357890
Timestamp ,xyz=1 ,abc =2 , def =6 , memory=64987201

现在我想要最后一列 ( memory) 的最高值。我在此日志文件中包含最近四天的日志行,因此它是非常大的文件。

答案1

由于我们只寻找最大值,因此不需要排序,只需扫描文件即可:

awk -F "=" '
    $NF > max {max = $NF}
    END {print max}
' ansh.log

如果你喜欢单行

awk -F= '$NF > max {max = $NF} END {print max}' ansh.log

答案2

您可以使用 sed/cut/awk 获取它,因为您喜欢将其分开,然后对答案进行排序,仅显示最后一个,然后您得到最高的一个

带有许多子命令的示例更易于阅读:

$
 cat > /tmp/a #define a fake-file for test/demo
Timestamp ,xyz=1, abc=2, def=6 ,memory=64357890 Timestamp ,xyz=1 ,abc =2 , def =6 , memory=64987201
Timestamp ,xyz=1, abc=2, def=6 ,memory=64357890 Timestamp ,xyz=1 ,abc =2 , def =6 , memory=64987555
Timestamp ,xyz=1, abc=2, def=6 ,memory=64357890 Timestamp ,xyz=1 ,abc =2 , def =6 , memory=64798797
Timestamp ,xyz=1, abc=2, def=6 ,memory=64357890 Timestamp ,xyz=1 ,abc =2 , def =6 , memory=64911111
Timestamp ,xyz=1, abc=2, def=6 ,memory=64357890 Timestamp ,xyz=1 ,abc =2 , def =6 , memory=61111111
$
  sed "s/ Time/\nTime/1 ; s/.*=//" /tmp/a | sort -n | tail -1 # one line for each timestamp even we have many on same line / then get only number / then sort numbers / then keep only the last one (higher cause they are sorted)
64987555 
$
 variable=$(sed "s/ Time/\nTime/1 ; s/.*=//" /tmp/a | sort -n | tail -1)  # if your want that in a variable only
$
 echo ${variable}
64987555
$
 rm /tmp/a  # remove test-file 

答案3

由于 @glennjackman 已经涵盖了 awk 脚本,因此这里有一个替代方案,它实际上非常简洁且高效,假设您=在每行上始终有 4 个,如示例输入所示:

$ cut -d'=' -f5 file | sort -rn | head -1
64987201

如果您的数量不定,=则可以随时将该cut命令替换为awk -F'=' '{print $NF}'.

答案4

这是另一个类似于 Ed Morton 答案的答案,但这不需要固定数量=

grep -oh "memory.[0-9,=]*" file | cut -d'=' -f2 | sort -rn | head -1

相关内容