读取日志文件的内容并在shell脚本中进行计算

时间:2017-06-09 10:24:51

标签: bash shell

我想实现一个提供以下功能的shell脚本程序:

  • 它将日志文件作为输入。日志文件包含带有消息标记的日志语句,如下所示。
  • 该实用程序列出了超过指定时间的所有操作。从命令行以秒为单位指定时间。

输入:

#<process id> <date time> <log level> <file name> <line number> <actual message>

1098 2007-02-28 15:23:09 WARN db_util.c 5928 Config file not found, using default values
1098 2007-02-28 15:23:09 INFO db_util.c 5908 Connecting to database
1098 2007-02-28 15:23:17 INFO db_util.c 5908 Connected to database
1098 2007-02-28 15:23:17 ERROR log_test.c 198 Unable to setup our satellite launch system
1098 2007-02-28 15:23:18 INFO log_test.c 198 Reconnecting to launch the satellite
1098 2007-02-28 15:23:21 INFO log_test.c 198 Reconnected. Initialize to launch the satellite.

电子。 G。如果通过将输入文件作为输入并且性能阈值时间为2秒来执行该实用程序,则应该生成此输出:

1098 2007-02-28 15:23:09 INFO db_util.c 5908 Connecting to database
1098 2007-02-28 15:23:18 INFO log_test.c 198 Reconnecting to launch the satellite

1 个答案:

答案 0 :(得分:0)

在bash脚本中使用awk:

#!/bin/bash
awk -v threshold=$1 '{texttime=mktime(gensub(/-|:/," ", "g", $2" "$3))} NR>1 && texttime-prevtexttime>threshold{print prevrecord} {prevtexttime=texttime; prevrecord=$0}' $2

其中$1是您的阈值时间(以秒为单位),$2是您的日志文件

这个awk脚本是:

  1. 将变量threshold设置为$1-v threshold=$1
  2. 中的任何内容
  3. 将当前记录的日期和时间转换为unix时间戳(mktime(gensub(/-|:/," ", "g", $2" "$3)))并将其存储在awk变量texttimetexttime=)中。可能有一种更优雅的方式,我以前在awk没有使用日期和时间。我确定@edmorton会让我直截了当,如果这是一种丑陋的做法。
  4. 如果我们没有处理第一条记录(NR>1),则texttime变量中的值减去prevtexttime变量中的值大于我们中的值threshold变量(texttime-prevtexttime>threshold)然后在变量prevrecordprint prevrecord)中打印值。
  5. 处理完记录后,将变量prevtexttime设置为texttime中的值,并将变量prevrecord设置为此记录的内容$0prevtexttime=texttime; prevrecord=$0
  6. 对于$2
  7. 中指定的任何文件