【问题标题】:Searching logs in UNIX between To and FROM date in shell script在 shell 脚本中的 To 和 FROM 日期之间搜索 UNIX 中的日志
【发布时间】:2016-08-30 07:39:18
【问题描述】:

我有一个使用 grep 命令搜索日志目录的脚本,下面是命令。

export CMD="grep -ie '.*${RUN_DATE}.*${MESSAGE_TO_SEARCH}' ${LOG_FILE_PATH}/${LOG_FILE} | awk -F 'addInfo' '{print \$2;}' | sed '/^$/d'"

现在 RUN_DATE 是脚本运行的任何日期。

MESSAGE_TO_SEARCH 是我们在日志文件中搜索的任何消息。

在启动脚本之前声明。

我想修改它在 TO 和 FROM 时间之间搜索的脚本,例如:

FROM_TIME=2016-08-28 13:30:00 和

TO_TIME=2016-08-29 17:00:00

所以脚本应该只给出这段时间内的日志。

我通过使用传递日期作为正则表达式尝试了以下操作,但它不起作用。

export CMD="grep -ie '.*[${FROM_DATE}-${TO_DATE}].*${MESSAGE_TO_SEARCH}' ${LOG_FILE_PATH}/${LOG_FILE} | awk -F 'addInfo' '{print \$2;}' | sed '/^$/d'"

请提出正确的方法。谢谢

EDIT1:如果正则表达式不适合它,请告诉我一种方法。

【问题讨论】:

  • 不要将命令存储在变量中。您需要使用 eval 才能使用它。
  • 你能给我举个例子吗
  • Regex 不是匹配日期范围的最佳工具。使用脚本解析日志文件名会更好。 Here is an example 展示了正则表达式对于日期的复杂程度

标签: regex bash shell unix time


【解决方案1】:

如果你只是想从日志文件中选择行,还有另一种方法,一些简单的命令,但更具可读性。

1.获取第一行和最后一行的行号。

# SN for start line number, EN for end line number.

export SN=`cat -n LOG_FILE | grep START_TIME | head -1 | awk '{print $1}'`
export EN=`cat -n LOG_FILE | grep END_TIME | tail -1 | awk '{print $1}'`

2.得到你想要的线条。

head -$EN LOG_FILE | tail -$(($EN-$SN+1))

一旦我们知道了需要的行号,就可以用head和tail把不需要的部分剪掉。 ^_^

【讨论】:

    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多