Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash grep数据格式错误的日志的最后10分钟_Bash - Fatal编程技术网

Bash grep数据格式错误的日志的最后10分钟

Bash grep数据格式错误的日志的最后10分钟,bash,Bash,我的日志在每行开头都有以下日期格式: 2018 Sep 21 17:16:27:796 我需要把这日志的最后10分钟。。。有什么帮助吗 我目前的实验: tenminutesago=$(date --date='10 minutes ago' +"%Y %b %e %H:%M:%S"):999 我的想法是将日志格式转换为累进数字,然后检查大于该数字的所有内容 我看到命令:date+%Y%b%e%H:%M:%S“给出了与日志格式相同的日期。命令:date+%Y%m%e%H%m%S“在假定您的日

我的日志在每行开头都有以下日期格式:

2018 Sep 21 17:16:27:796
我需要把这日志的最后10分钟。。。有什么帮助吗

我目前的实验:

tenminutesago=$(date --date='10 minutes ago' +"%Y %b %e %H:%M:%S"):999 
我的想法是将日志格式转换为累进数字,然后检查大于该数字的所有内容


我看到命令:
date+%Y%b%e%H:%M:%S“
给出了与日志格式相同的日期。命令:
date+%Y%m%e%H%m%S“
在假定您的日志线如下的情况下,以累进数字形式给出日期
(201810041204019)

YYYY Bbb dd HH:MM:SS:sss Some random log message is here
您可以执行以下操作:

awk -v d=$(date -d "10 minutes ago" "+%Y %m %d %T") '
     { mm = sprintf("%0.2d",(index("JanFebMarAprMayJunJulAugSepOctNovDec",$2)+2)/3) 
       s = $1 " " mm " " $3 " "$4 }
     (s >= d){print}' logfile
其想法是将日期格式转换为可排序的格式(注意“Jan”<“Mar”但“Feb”<“Jan”)。这是通过将月份转换为两位数的数字,然后将其与正确的日期进行严格比较来实现的。

您可以这样做

for i in {10..0}; do
    d=$(date -d "$i minutes ago" +'%Y %b %e %H:%M')
    grep "$d" logfile
done
这只是将问题分为11个连续的子任务,即获取10分钟前的所有行、9分钟前的所有行,等等,直到当前一分钟

编辑:

这里有一个替代解决方案,它可以打印第一行之后的所有行,其中找到了最后10分钟的日期戳,而不仅仅是那些带有日期戳的行,还可以避免从开始几次读取文件:

# build a regex pattern that matches any date in the given format from the last 10 minutes
pattern=$(date +'%Y %b %e %H:%M')
for i in {10..1}; do
    pattern+=\|$(date -d "$i minutes ago" +'%Y %b %e %H:%M')
done

# print all lines starting from the first one that matches one of the dates in the pattern
awk "/$pattern/,0" logfile

在没有秒和毫秒的情况下尝试当前方法

tenminutesago=$(date --date='10 minutes ago' +"%Y %b %e %H:%M")
这并不是最后十分钟的第二关,但我认为对大多数情况来说已经足够了。这将在时间窗口内为您提供日志中的第一行。现在,您可以获得总行数并减去上一个grep的行号,然后跟踪文件。脚本可以是这样的:

LOGFILE="filename.log"
tenminutesago=$(date --date='9000 minutes ago' +"%Y %b %e %H:%M") # matching pattern
tlines=$(cat $LOGFILE | wc -l) # Total lines in file
let lines=$tlines-$(grep -n "$tenminutesago" $LOGFILE | grep -m 1 -oP "^[0-9]*" || echo $tlines) # lines after matching occurence
echo "$lines lines FOUND from the last X minutes"
tail -n $lines $LOGFILE # last lines in file
正如所建议的,这可以通过在尾部使用+N选项来减少

LOGFILE="filename.log"
tenminutesago=$(date --date='9000 minutes ago' +"%Y %b %e %H:%M") # matching pattern
lines=$(grep -n "$tenminutesago" $LOGFILE | grep -m 1 -oP "^[0-9]*" || echo "0") # lines after matching occurence
echo "$lines lines FOUND from the last X minutes"
let lines -eq 0 && tail -n +$lines $LOGFILE # last lines in file if lines is not 0


到目前为止你都尝试了什么?欢迎来到stackoverflow。这不是一个编码服务网站。告诉我们,到目前为止你在a中做了什么,你会得到帮助我有一个公式来计算日期(在这个公式中)减去10分钟:十分钟前=$(日期--date='10分钟前'+%Y%b%e%H:%M:%S”):9999对不起,我是新来的,我想给你一个更好的评论,等一下。我现在的实验:
十分钟前=$(date--date='10分钟前'+%Y%b%e%H:%M:%S'):999
我的想法是将日志格式转换为累进数,然后检查大于该数字的所有内容。我看到命令:
date+%Y%b%e%H:%M:%S“
以相同的日志格式给出日期。命令:
date+%Y%M%e%H%M%S”
以累进的数字给出日期(201810041204019)。虽然我非常喜欢这种方法,但我必须指出,在非常大的文件上,这种方法可能会失败,处理文件需要1分钟以上的时间(想象一下TB文件上的超慢nfs)这似乎工作得很好!谢谢你,你救了我一天。超过500kb的日志速度是可以接受的,我将尝试使用更大的日志。目前我正在使用你的解决方案,它似乎更容易和有效…只是有一个小问题,日志的某些行不以日期开始,并以这种方式被忽略。我知道,此日志完全是一团乱:-(只要行的格式相同,日期出现在哪里就不重要了。你能发布一个即使在你期望的情况下也无法匹配的行的示例吗?嗨,山姆,我测试了第一行,效果很好,但输出当然不包含任何以日期开始的行。遗憾的是,此日志中的某些行不符合要求。)同样的格式,或者可能是之前行的延续(但在日志中被认为是新行),这似乎不起作用。此时,我的日志中出现了最新的错误,日期为2018年10月8日19:48:41:699。因此,为了尝试您的代码并捕捉这行代码,我将您的代码更改为“9000分钟前”它生成日期2018年10月4日06:12:15结果是:awk:fatal:无法打开文件'4'进行读取(没有这样的文件或目录)@AndreaZ.能否请您提供有关日志文件外观的信息,并准确键入您为获取此错误而键入的命令。一行有错误:
2018 Aug 02 11:41:18:662 GMT+0200 SomeStufghere error OtherStufghere
。小问题:有些行不以日期开头。因此我
grep GMT | grep-I日志中出现错误
。这似乎不起作用。为了捕获日志中存在的实际错误,我将10分钟前的扩展到9000分钟前。第一行的结果是:grep:Oct:没有这样的文件或目录grep:4:没有这样的文件或目录grep:06:13:没有这样的文件或目录-bash:let:lines=3272-:语法错误:操作数expected(错误标记为“-”)我更新了命令并在变量$tenminutesago周围加了引号。但是,如果日志中没有与$tenminutesago值匹配的条目,则会出现错误,我正在处理这种情况。-bash:let:lines=3273-:语法错误:应为操作数(错误标记为“-”)你能把$tenminutesago的值公布出来,并检查grep是否返回了至少一行匹配的内容吗?我更新了答案,现在它是脚本形式的。我希望这能有所帮助