首页 > 解决方案 > 如何找到所有大于可变时间戳的错误日志?

问题描述

我正在尝试编写一个 shell 脚本冒烟测试,它将接受一个可选的可变长度时间戳参数(2019-08-08 22:35:02,846),搜索日志并显示所有大于此时间戳的错误行。如果没有提供时间戳,它应该搜索整个文件。

例如,“2019-08-07”会发现所有大于这一天的错误行。“2019-08-07 05”会发现所有大于这一小时的错误行,“2019-08-07 05:23”会大于这一分钟,等等。

直接在控制台中运行正下方的行按预期工作。它只会打印出此日期之后的行。但是,当我尝试在 shell 脚本中执行此操作并将时间戳作为变量参数传递时,它将打印整个日志中的每个错误。

echo "`grep 'ERROR' "/some-directory/some.log" | awk '$0 > "2019-08-07\ 04:00"'`"

我认为问题在于 awk 命令。我尝试将时间戳变量放在单引号、双引号、括号中,但我无法让它重现与命令行相同的输出。

如果它包含一个不同的 awk 方法,我也尝试转换传入的时间戳以转义空间,如果它看到一个空间,我尝试过抱怨。

TIME="$(echo $1 | sed 's/ /\\ /g')"
# Code that I'm trying...
TIME="$1"
SEARCH="ERROR"
LOG="/some-directory/some.log"
RESULT="$(grep $SEARCH $LOG | (awk '$0 > $TIME'))"
echo "$RESULT"

日志格式的示例...

2019-08-07 00:50:54,526 [blah] ERROR blah blah blah
2019-08-07 01:40:54,527 [blah] INFO blah blah blah
2019-08-07 05:04:06,837 [blah] ERROR blah blah blah
2019-08-08 02:23:15,838 [blah] WARNING blah blah blah
2019-08-08 22:35:02,846 [blah] ERROR blah blah blah

当传递“2019-08-07 04:00”的时间戳时,输出应该是......

2019-08-07 05:04:06,837 [blah] ERROR blah blah blah
2019-08-08 22:35:02,846 [blah] ERROR blah blah blah

标签: linuxbash

解决方案


$TIME命令中的awk没有正确引用,因此它没有被扩展bash

尝试

$ cat some.sh
TIME="$1"
SEARCH="ERROR"
LOG="some.log"
RESULT=$(grep $SEARCH $LOG | awk '$0 > "'"$TIME"'"')
echo "$RESULT"
IT070137 ~/tmp/stackoverflow $ bash some.sh "2019-08-07 04:00"
2019-08-07 05:04:06,837 [blah] ERROR blah blah blah
2019-08-08 22:35:02,846 [blah] ERROR blah blah blah

推荐阅读