【问题标题】:Extract data from log [duplicate]从日志中提取数据[重复]
【发布时间】:2015-05-03 20:54:33
【问题描述】:

我有格式的日志

##<01-Mar-2015 03:48:18 o'clock GMT> <info> 
##<01-Mar-2015 03:48:20 o'clock GMT> <info>
##<01-Mar-2015 03:48:30 o'clock GMT> <info>
##<01-Mar-2015 03:48:39 o'clock GMT> <info>

我必须编写 shell 脚本来从日志文件中最后记录的数据中提取最后 5 分钟的数据,然后在其中搜索一个字符串。我是 shell 脚本的新手,我使用了 grep 命令,但它没有用。有人能帮我一下吗。 我尝试了以下脚本

#!/bin/bash

H=1  ## Hours
LOGFILE=/path/to/logfile.txt

X=$(( H * 60 * 60 )) ## Hours converted to seconds

function get_ts {
DATE="${1%%\]*}"; DATE="${DATE##*\[}"; DATE=${DATE/:/ };                 DATE=${DATE//\// }
TS=$(date -d "$DATE" '+%s')
}

get_ts "$(tail -n 1 "$LOGFILE")"
LAST=$TS

while read -r LINE; do
get_ts "$LINE"
(( (LAST - TS) <= X )) && echo "$LINE"
done < "$LOGFILE"

并在运行时得到以下错误 get_ts: DATE=${DATE/:/ }: 0403-011 指定的替换对该命令无效。

【问题讨论】:

  • 请edit您的问题显示您已经尝试过的内容以及一些带有相应所需输出的示例输入。

标签: shell unix awk scripting sh


【解决方案1】:

如果您使用awk,您可以使用date 获取数据,例如最后5 分钟,如下所示:

awk '$0>=from' from="$(date +"##<%d-%b-%Y %H:%M:%S" -d -5min)" logile

PS,你需要date 命令来匹配你的格式。

【讨论】:

  • stackoverflow.com/a/28815704/2088135 的可能重复答案:)
  • 它给了我整个日志文件
  • @Angel1403 我只是更改了date 格式一些。它需要 100% 正确,否则你会得到所有。运行此date +"##&lt;%d-%b-%Y %H:%M:%S" 并查看它是否与行首匹配。
  • 好吧,那你还在等什么?!
  • @TomFenech 一杯咖啡,好天气。
【解决方案2】:

我会将日期解析为自纪元以来的秒数,并将其与系统时间进行比较:

TZ=GMT awk -F '[#<> :-]+' 'BEGIN { split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", mnames, ","); for(i = 1; i <= 12; ++i) m[mnames[i]] = i } mktime($4 " " m[$3] " " $2 " " $5 " " $6 " " $7) + 300 >= systime()' filename

-F '[#&lt;&gt; :-]+' 是将日期拆分为单独的部分,因此$2 是日期,$3 是月份,$4 是年份,依此类推。然后代码工作如下:

BEGIN {
  # build a mapping from month name to number (to use in mktime)
  split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", mnames, ",")
  for(i = 1; i <= 12; ++i) m[mnames[i]] = i
}

# build a numerically comparable timestamp from the split date, and
# select all lines whose timestamp is not more than 300 seconds behind
# the system time.
mktime($4 " " m[$3] " " $2 " " $5 " " $6 " " $7) + 300 >= systime()

将TZ 环境变量设置为GMT(在awk 调用之前使用TZ=GMT)将使mktime 将时间戳解释为GMT。

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 2022-10-13
    • 2011-11-26
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多